私はマルチスレッドアプリケーションを持っています。別のスレッドのオブジェクトをツリービューに追加する必要があります。しかし、私は例外を取得し続ける別のスレッドからツリービューにオブジェクトを追加する方法
このコントロールで実行されているアクションが間違ったスレッドから呼び出されています。このアクションを実行するには、Control.InvokeまたはControl.BeginInvokeを使用して正しいスレッドにマーシャリングします。
はここに私のコード
ThreadPool.QueueUserWorkItem(new WaitCallback(GetFiles), entryPoint);
private void GetFiles(object entryPoint)
{
var localData = entryPoint as EntryPoint;
this.GetFiles(localData.DirectoryInfo, localData.TreeNode);
localData.ManualEvent.Set();
}
private void GetFiles(DirectoryInfo directory, TreeNode tree)
{
for (int i = 0; i < allFiles.GetLength(0); i++)
{
tree.Nodes.Add(allFiles[i].Name);
}
}
これは標準的なメッセージです.UUIスレッド以外からUIスレッドによって作成された要素は変更できません。 BeginInvoke()は、スレッドのメインフォーム上の匿名デリゲートまたは通常のデリゲートと共に使用します。私は、lambdaとlinqはもっと良い方法を提供すると思います。 – icbytes
私は代理人の助けを借りてやっているが、まだ例外を受け取るpublic delegate void MyDelagate(TreeNode tree、string value); public MyDelagate TreeViewDelegate; TreeViewDelegate =デリゲート(TreeNodeツリー、文字列s) { tree.Nodes.Add(s); }; TreeViewDelegate.Invoke(tree、allFiles [i] .Name); – Ilia
IMHOあなたは 'ThreadPool'を全く使う必要はありません。 UIスレッドのメソッドを呼び出すだけです。あなたの方法は重要な仕事をしていません。 –