web-dev-qa-db-ja.com

STAスレッドを実行するタスク(TPL)を作成する方法は?

スレッドの使用は非常に簡単です

 Thread thread = new Thread(MethodWhichRequiresSTA);
 thread.SetApartmentState(ApartmentState.STA);  

WPFアプリケーションでタスクを使用して同じことを達成する方法は?コードは次のとおりです。

Task.Factory.StartNew
  (
    () => 
    {return "some Text";}
  )
   .ContinueWith(r => AddControlsToGrid(r.Result));  

私はInvalidOperationExceptionを取得しています

多くのUIコンポーネントがこれを必要とするため、呼び出しスレッドはSTAでなければなりません。

72
Michel Triana

TaskScheduler.FromCurrentSynchronizationContext Method を使用して、現在の同期コンテキスト(WPFアプリケーションを実行しているときのWPFディスパッチャー)の TaskScheduler を取得できます。

次に、TaskSchedulerを受け入れる ContinueWith オーバーロードを使用します。

var scheduler = TaskScheduler.FromCurrentSynchronizationContext();

Task.Factory.StartNew(...)
            .ContinueWith(r => AddControlsToGrid(r.Result), scheduler);
72
dtb

質問の本当の意図を探しに来る将来の訪問者のために:

31
Mrchief