异步使用async和await更新Winforms中的TreeView

时间:2016-07-06 13:07:49

标签: c# asynchronous treeview async-await

我运行了这段代码并将新的TreeView对象分配给treeFolders TreeView表单对象:

WM_SIZE

我很高兴,因为代码不会阻止UI,它会递归并递归目录并构建一个TreeView对象。问题是我的表单上的treeFolders TreeView对象即使在运行此代码后仍然为空。如果我在中断模式下检查treeFolders对象,我可以看到它确实有文件和目录的节点,所以我无法理解为什么它不显示它们。是否与TreeView是在对UI线程的不同威胁上创建的事实有关?这是ListDirectory似乎工作正常并加载所有必需的目录和文件

private async void butLoad_Click(object sender, EventArgs e)
    {

        Task<TreeView> task = Task.Run(() => DirectoryTree.ListDirectory("C:\\"));
        this.treeFolders = await task;

    }

1 个答案:

答案 0 :(得分:1)

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

您应该在非UI线程中执行长时间运行的非UI操作,而不是在非UI线程中执行所有操作。所以这意味着只需在调用GetFiles内调用GetDirectoriesTask.Run,剩下的代码(这是你的UI代码)就可以在UI线程中运行。