我有一个包含目录信息的树视图。我有一个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()
}