构建TreeView导致表单冻结

时间:2018-11-01 22:00:11

标签: c# multithreading winforms treeview

我正在尝试构建一个可拉回所有目录和文件并构建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;
        }

0 个答案:

没有答案