[英]Async Updating a TreeView in Winforms using async and await
我運行了這段代碼,並將新的TreeView對象分配給treeFolders TreeView表單對象:
private async void butLoad_Click(object sender, EventArgs e)
{
Task<TreeView> task = Task.Run(() => DirectoryTree.ListDirectory("C:\\"));
this.treeFolders = await task;
}
我很高興,因為代碼不會在進入並遞歸目錄並構建TreeView對象時阻止UI。 問題是即使運行此代碼后,窗體上的treeFolders TreeView對象仍然為空。 如果以中斷模式檢查treeFolders對象,我可以看到它確實具有文件和目錄的節點,因此我無法理解為什么它不顯示它們。 這與TreeView是在對UI線程的另一種威脅下創建的事實有關嗎? 這是ListDirectory,它似乎可以正常工作並加載所有必需的目錄和文件
public class DirectoryTree
{
public static async Task<TreeView> ListDirectory(string path)
{
TreeView treeView = new TreeView();
var rootDirectoryInfo = new DirectoryInfo(path);
treeView.Nodes.Add(await CreateDirectoryNode(rootDirectoryInfo));
return treeView;
}
private static async Task<TreeNode> CreateDirectoryNode(DirectoryInfo directoryInfo)
{
try
{
var directoryNode = new TreeNode(directoryInfo.Name);
foreach (var directory in directoryInfo.GetDirectories())
directoryNode.Nodes.Add(await CreateDirectoryNode(directory));
foreach (var file in directoryInfo.GetFiles())
directoryNode.Nodes.Add(new TreeNode(file.Name));
return directoryNode;
}
catch ( Exception ex)
{
var directoryNode = new TreeNode(directoryInfo.Name);
return directoryNode;
}
}
}
通過使用Task.Run
調用頂級方法調用,您將在非UI線程中執行整個操作。 但是,您需要與UI交互的代碼才能在UI線程而不是非UI線程中運行。
您應該只在非UI線程中執行長時間運行的非UI操作,而不是在非UI線程中執行所有操作。 因此,這意味着只需在對Task.Run
的調用內調用GetFiles
和GetDirectories
,剩下的代碼(這就是您的UI代碼)可以在UI線程中運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.