2011-12-29 14 views
0

私は、次の試してみました:バックグラウンドスレッドでUIを作成するWPF?

var task = new Task(() => 
    { 
     for (int i=0; i<10; i++) { 
      //Create new Grid HERE 
      // Add Table with some dynamic data here.. 
      // print the above Grid here. 
     } 

    }); 

task.ContinueWith((previousTask) => 
    { 
     label.Content = printerStatus(); // will return "Out of Paper", "printing", "Paper jam", etc. 
    }, 
    TaskScheduler.FromCurrentSynchronizationContext()); 

label.Content = "Sending to printer"; 

それは、次のエラーが返されます。多くのUIコンポーネントがこれを必要とするため、呼び出し元のスレッドは、STAである必要があります。..

それは新しいUIオブジェクトのグリッドを作成しようとするとエラーが発生します。

どうすればこの問題を解決できますか?他の方法arroundがあるなら私に知らせてください!

答えて

2

タスクでは、MTAにあるスレッドプールスレッドを使用します。

バックグラウンドSTAスレッドが必要な場合は、自分で作成し、明示的にApartmentStateを設定する必要があります。ラベルと起動のためのディスパッチャを使用して

Thread t = new Thread(...); 
t.SetApartmentState(ApartmentState.STA); 
t.Start(); 
+0

私にサンプルコードを表示できますか?私はこの技術には非常に新しいです。 – user995387

+0

これを使ってタスクが完了したことをどのように知ることができますか? – user995387

+0

基本については[Joe Albahari](http://www.albahari.com/threading/)を読むことをお勧めします。 STAが必要な場合は、スレッドではなくタスクを使用しなければならないので、 'ContinueWith'はありません。代わりにあなたのスレッドメソッドの中から 'Dispatcher.Invoke'を使う必要があります。 –

1

役立つかもしれません:あなたは、メインUIスレッドとは異なるスレッドでUIオブジェクトを作成することはできません

label.Dispatcher.Invoke(
     System.Windows.Threading.DispatcherPriority.Normal, 
     new Action(
     delegate() 
     { 
      label.Content = printerStatus(); 
     } 
    )); 
+0

グリッドを作成できません!それを作成しているGridオブジェクトにエラーが表示されます。 – user995387

+0

グリッドとは、DataGridViewまたはSimple Gridのデータ構造を意味します。 – crypted

+0

WPFグリッド。 UIコンテンツを保持する.msdn.microsoft.com/ja-us/library/system.windows.controls.grid.aspx – user995387

1

とすぐにUIに追加しているため、それParentプロパティを設定しようとすると、WPFのスレッドは別のスレッドで作成されたオブジェクトを変更できません。

代わりに、私は2番目のスレッドでグリッドのデータのリストまたはコレクションを作成し、ItemsControlのようなものを使用してUIにバインドするお勧めします。これにより、すべてのUIオブジェクトがメインUIスレッドに保持され、バックグラウンド処理はバックグラウンドスレッドで実行されます。

ステータスラベルなどのバックグラウンドスレッドからUIオブジェクトを更新するには、lawrencealan's answerのようにDispatcherを使用することをおすすめします。 Dispatcherは、メインUIスレッド用のWPFの内部メッセージキューです

+0

それはある程度の大きな救済だった..ありがとう – user995387

関連する問題