暂停UI线程,直到后台工作完成

时间:2018-03-09 02:07:23

标签: c# backgroundworker

我有一个包含目录信息的树视图。我有一个btnMoveFiles_click事件,它调用后台工作程序来移动一些文件,因为我正在使用进度条。完成后,如果已创建文件夹,则使用第二个后台工作程序重建树视图。最后一步是重新选择树视图中的初始节点。为此,我使用递归脚本并使用以下代码通过fullpath查找:

    private void selectCurrentNode()
    {
        tvSourceDirectories.SelectedNode = GetNode(currentFullPath);            
    }
    private TreeNode GetNode(string FullPath, TreeNode rootNode)
    {
        foreach (TreeNode node in rootNode.Nodes)
        {
            if (node.FullPath.Equals(FullPath)) return node;

            //recursion
            var next = GetNode(FullPath, node);
            if (next != null) return next;
        }
        return null;
    }

    private TreeNode GetNode(string FullPath)
    {
        TreeNode itemNode = null;
        foreach (TreeNode node in tvSourceDirectories.Nodes)
        {
            if (node.FullPath.Equals(FullPath)) return node;

            itemNode = GetNode(FullPath, node);
            if (itemNode != null) break;
        }
        return itemNode;
    }

我的问题是它适用于不太复杂的目录结构,但如果文件夹太多,则不会选择正确的节点。在调试时,似乎selectCurrentNode()方法在backgroundworker完成之前运行并且没有返回任何节点,因此该方法无效。如果我将方法附加到单独的按钮事件并为树视图重建留出时间,则它可以完美地工作。这似乎是一个时间问题。 有没有办法暂停btnMoveFiles_click事件中的ui线程,等待后台工作者完成树视图重建。 虽然到目前为止我没有遇到任何问题,但是在移动文件后台工作完成之前(如果要处理多个文件),我可能会遇到与第二个后台工作者类似的问题。我可以,并且最初确实调用了第一个完成的runworker完成的第二个后台工作者,但仍然没有解决在backgroundworkeer完成之前selectCurrentNode()触发的主要问题。 实际上,我需要一种方法来阻止涉及ui的任何进一步处理,直到各个背景工作者完成。 我没有包含backgroundworker代码,因为它认为它与问题无关,但如果需要可以这样做。 感谢

click事件如下,selectCurrentNode()在其他事件完成之前运行。

private void btnMoveFiles_Click(object sender, EventArgs e)
{
   bgwMoveFiles.RunWorkerAsync();
   bgwGetSourceTV.RunWorkerAsync();
   selectCurrentNode()
}

0 个答案:

没有答案