2016-07-06 1 views
0

私は、コードのこの部分が実行されているとtreeFoldersのツリービューのフォームオブジェクトに新しいツリービューオブジェクトを割り当てることがあります。非同期

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

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

    } 

私はコードがブロックされないよう幸せですそれが行くと、ディレクトリを再帰的にし、TreeViewオブジェクトを構築します。問題は、このコードを実行した後でもフォーム上の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; 
     } 
    } 
} 
+0

スレッドプールスレッドでUIオブジェクトを作成しないでください。その代わりに、メモリ内のツリー構造を作成し、それを 'ListDirectory'メソッドから返し、UIスレッドが実際のUIオブジェクト(' TreeNode'など)を作成させるようにしてください。 –

+0

これはCのディレクトリですので、あなたは許可されていない例外を受け取っていないと確信していますか? – WBuck

+0

try catchブロックが許可されていない例外を扱います – ravetroll

答えて

1

あなたはTask.Runを使用して、トップレベルのメソッドの呼び出しを呼び出すことにより、非UIスレッドでの動作の全体を実行しています。しかし、非UIスレッドではなくUIスレッドで実行するには、UIと対話するコードが必要です。

あなたは非UIスレッドでは、非UIスレッドではなくすべての操作をのみ長時間実行非UIの操作を実行する必要があります。つまり、の呼び出しの中にGetFilesGetDirectoriesを呼び出すだけで、残りのコード(UIコード)はUIスレッドで実行されます。