Создание TreeView приводит к зависанию моей формы - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь создать приложение, которое извлекает все каталоги и файлы и создает Treeview. У меня есть некоторый код ниже, который делает это, однако он, кажется, заставляет мой пользовательский интерфейс зависать во время сборки.

Я не уверен, что это проблема с потоками? Я думаю, что код, который строит древовидное представление, находится в отдельном потоке пользовательского интерфейса, хотя в этом я не уверен.

Я также читал, что мне может понадобиться изучить виртуализацию пользовательского интерфейса / виртуализацию данных. Если бы кто-нибудь мог указать мне правильное направление, это было бы очень полезно.

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)));

        }

Я думаю, что это может быть причиной, так как я думаю, что пользовательский интерфейс зависает, поскольку directoryNode.Nodes.Add(new TreeNode(file.Name)); выглядит как запись в потоке пользовательского интерфейса?

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;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...