Я пытаюсь создать приложение, которое извлекает все каталоги и файлы и создает 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;
}