异步 使用 async 和 await 更新 WinForms 中的树视图
本文关键字:视图 WinForms 更新 使用 async await 异步 | 更新日期: 2023-09-27 17:55:11
我运行了这段代码,并将一个新的 TreeView 对象分配给 treeFolder TreeView 表单对象:
private async void butLoad_Click(object sender, EventArgs e)
{
Task<TreeView> task = Task.Run(() => DirectoryTree.ListDirectory("C:''"));
this.treeFolders = await task;
}
我很高兴,因为代码在 UI 去时不会阻塞 UI,并递归目录并构建 TreeView 对象。 问题是即使在运行此代码后,窗体上的 treeFolder TreeView 对象仍然为空。 如果我在中断模式下检查 treeFolder 对象,我可以看到它确实有文件和目录的节点,所以我不明白为什么它不显示它们。 这是否与 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 线程中运行。