2012-03-01 9 views
2

Winformアプリケーションをビルドしていて、ディレクトリツリーを表すTreeViewを更新したいと考えています。このメソッドは1〜2秒かかるので、私はそれを並行して実行したい。タスクのSystem.Windows.Forms.dllで 'System.InvalidOperationException'が発生しました

まず、このコードを使用してTask.Factory.StartNew()を使用しますが、エラー'System.InvalidOperationException' occurred in System.Windows.Forms.dll in Taskが届きました。

Task loadTreeViewTask = Task.Factory.StartNew(() => 
     { 
      try { 
       directoryTreeView.Nodes.Clear(); 
       .... 
       PopulateTreeView(directory, directoryTreeView.Nodes[0]); 
      } 
      catch (Exception e) { 
       //Log 
       //Change try/catch to CancellationToken 
      } 
     }); 

は、それから私は、WindowsがシングルスレッドUIで動作することを見た、と私はInvokeRequiredを使用する必要があることがわかった:

directoryTreeView.Invoke((MethodInvoker)(() => 
{ 
    try { 
    directoryTreeView.Nodes.Clear(); 
    .... 
    PopulateTreeView(directory, directoryTreeView.Nodes[0]); 
    } 
    catch (Exception e) { 
    //Log 
    //Change try/catch to CancellationToken 
    } 
})); 

これを行うには良い方法はありますか?

+1

バックグラウンドでより効果的なモデルクラスを作成し、最終的に特定のチェックポイントで独自のイベントを呼び出すと、状況が悪くなります。イベントの使用方法は絶対にわかりません。ビューを更新するために誰かがイベントを使用した場合、同じ問題が発生します。あなたは明らかに正しいことをしています。もう一方の端もイベントを正しく使っていますが、あなたのモデルはスレッドベースであり、bigbangは起こります... – Sebastian

答えて

1

UIスレッドで作成されたコントロールを更新しようとしているため、コードの最初の部分が機能しないため、Invokeメソッドを使用する必要があります。 UIスレッドで作成されたUIコントロールを別のスレッドから更新することはできません。

関連する問題