나는이 코드 조각을 실행하고 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;
}
}
}
스레드 풀 스레드에서 UI 개체를 만들지 마십시오. 대신 메모리에 트리 구조를 만들고 ListDirectory 메소드에서 반환 한 다음 UI 스레드에서 실제 UI 객체 ('TreeNode' 등)를 생성하게하십시오. –
당신이 C 디렉토리에 있기 때문에 Unauthorized 예외가 발생하지 않았습니까? – WBuck
try catch 블록이 승인되지 않은 예외를 처리합니다. – ravetroll