簡體   English   中英

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

[英]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的調用內調用GetFilesGetDirectories ,剩下的代碼(這就是您的UI代碼)可以在UI線程中運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM