2016-03-21 8 views
2

私はマルチスレッドアプリケーションを持っています。別のスレッドのオブジェクトをツリービューに追加する必要があります。しかし、私は例外を取得し続ける別のスレッドからツリービューにオブジェクトを追加する方法

このコントロールで実行されているアクションが間違ったスレッドから呼び出されています。このアクションを実行するには、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); 
    } 
} 
+1

これは標準的なメッセージです.UUIスレッド以外からUIスレッドによって作成された要素は変更できません。 BeginInvoke()は、スレッドのメインフォーム上の匿名デリゲートまたは通常のデリゲートと共に使用します。私は、lambdaとlinqはもっと良い方法を提供すると思います。 – icbytes

+0

私は代理人の助けを借りてやっているが、まだ例外を受け取る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

+0

IMHOあなたは 'ThreadPool'を全く使う必要はありません。 UIスレッドのメソッドを呼び出すだけです。あなたの方法は重要な仕事をしていません。 –

答えて

2

、あなたはUIスレッド上でUI関連のアクションを実行する必要があります。これを行うには、コントロール自体からBeginInvokeを使用できます。

private void GetFiles(DirectoryInfo directory, TreeNode tree) 
{ 
    if (TreeViewControl.InvokeRequired) 
    { 
     TreeViewControl.BeginInvoke((MethodInvoker)delegate 
     { 
      for (int i = 0; i < allFiles.GetLength(0); i++) 
      { 
       tree.Nodes.Add(allFiles[i].Name); 
      } 
     }); 
    } 
} 

詳細はhereです。

+0

WinFormsアプリケーションでDispatcherを使用する方法は? – Ilia

+0

このWinFormsはありますか?あなたのタグはWPFを述べています。 –

+0

申し訳ありませんが、私の欠陥 – Ilia

4

私はあなたがこれを行うために必要があると思うです:エラー状態として

Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => GetFiles(directory, tree))); 
+0

ようこそスタックオーバーフロー!このコードは質問に答えるかもしれませんが、いくつかの_context_を含める方が良いでしょう。_how_は動作していて、_when_はそれを使用しています。コードのみの回答は長期的には有用ではありません。 –

+0

Windowsフォームには「Dispatcher」はありません! – Enigmativity

+0

@Enigmativityこの回答が投稿されたときに質問にタグが付けられました[タグ:wpf] –