私は、コードのこの部分が実行されていると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;
}
}
}
スレッドプールスレッドでUIオブジェクトを作成しないでください。その代わりに、メモリ内のツリー構造を作成し、それを 'ListDirectory'メソッドから返し、UIスレッドが実際のUIオブジェクト(' TreeNode'など)を作成させるようにしてください。 –
これはCのディレクトリですので、あなたは許可されていない例外を受け取っていないと確信していますか? – WBuck
try catchブロックが許可されていない例外を扱います – ravetroll