1. ホーム
  2. c#

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

2023-08-05 10:21:47

質問

Threadの使い方はとても簡単です

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

WPFアプリケーションでタスクを使って同じことを実現するにはどうしたらよいでしょうか。以下は、いくつかのコードです。

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

でInvalidOperationExceptionが発生しました。

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

どのように解決するのですか?

あなたは TaskScheduler.FromCurrentSynchronizationContext メソッド を使用して タスクスケジューラ を取得します(WPFアプリケーションを実行している場合は、WPFディスパッチャです)。

次に ContinueWith のオーバーロードを使用します。

var scheduler = TaskScheduler.FromCurrentSynchronizationContext();

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