我正在尝试构建一个可拉回所有目录和文件并构建Treeview的应用程序。我下面有一些代码可以做到这一点,但是它会导致我的UI在构建时冻结。
我不确定这是否是线程问题?我认为构建树视图的代码位于UI的单独线程上,尽管我不确定这一点。
我还读到我可能需要研究UI虚拟化/数据虚拟化。如果有人能指出我正确的方向,那将非常有帮助。
private void btnSearch_Click(object sender, System.EventArgs e)
{
btnSearch.Text = "Searching...";
this.Cursor = Cursors.WaitCursor;
Application.DoEvents();
Thread treeThread = new Thread(() => ListDirectory(lstTreeView, "C:\\"));
treeThread.Start();
btnSearch.Text = "Search";
this.Cursor = Cursors.Default;
}
private void ListDirectory(TreeView treeView, string path)
{
var watch = System.Diagnostics.Stopwatch.StartNew();
this.Invoke((MethodInvoker)(() => treeView.Nodes.Clear()));
var rootDirectoryInfo = new DirectoryInfo(path);
this.Invoke((MethodInvoker)(() => treeView.Nodes.Add(CreatedirNode(rootDirectoryInfo))));
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
this.Invoke((MethodInvoker)(() => lblCount.Items.Add("Time taken in Sec " + (elapsedMs)/1000)));
}
我认为这也许是因为我认为UI directoryNode.Nodes.Add(new TreeNode(file.Name));
似乎正在UI线程上写而冻结吗?
private static TreeNode CreatedirNode(DirectoryInfo DirI) {
var directoryNode = new TreeNode(DirI.Name);
try
{
foreach (var directory in DirI.GetDirectories())
directoryNode.Nodes.Add(CreatedirNode(directory));
foreach (var file in DirI.GetFiles())
directoryNode.Nodes.Add(new TreeNode(file.Name));
}
catch (System.Exception excpt)
{
Console.WriteLine(excpt.Message);
}
return directoryNode;
}