2016-07-06 4 views
0

나는이 코드 조각을 실행하고 treeFolders 트 리뷰 형태의 객체에 대한 새로운 트 리뷰 개체를 할당 있습니다비동기

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

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

    } 

나는 코드를 차단하지 않는 한 행복 UI가가는 동안 디렉토리를 되풀이하고 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 디렉토리에 있기 때문에 Unauthorized 예외가 발생하지 않았습니까? – WBuck

+0

try catch 블록이 승인되지 않은 예외를 처리합니다. – ravetroll

답변

1

당신은 Task.Run를 사용하여 최고 수준의 메서드 호출을 호출하여 비 UI 스레드에서 작업의 전체을 수행하고 . UI가 아닌 스레드가 아닌 UI 스레드에서 실행하려면 UI와 상호 작용하는 코드가 필요합니다.

당신은 비 UI 스레드에서, 비 UI 스레드에서보다는 모든 작업을 긴 실행 비 UI 작업을 수행해야합니다. 따라서 이것은 Task.Run에 대한 호출 내에서 GetFilesGetDirectories을 호출하고 나머지 코드 (UI 코드)는 UI 스레드에서 실행하는 것입니다.