异步 使用 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;
        }
    }
}

异步 使用 async 和 await 更新 WinForms 中的树视图

通过使用

Task.Run 调用顶级方法调用,在非 UI 线程中执行整个操作。 但是,您需要与 UI 交互的代码才能在 UI 线程中运行,而不是在非 UI 线程中运行。

仅在非 UI 线程中执行长时间运行的非 UI 操作,而不是在非 UI 线程中执行所有操作。 因此,这意味着只需在调用Task.Run调用GetFilesGetDirectories,将其余代码(即您的 UI 代码)留在 UI 线程中运行。