Zachesの回答は完全に有効ですが(そして私がしばらく使用したアプローチです)、次を使用したよりエレガントなソリューションだと思うものに出くわしましたDispatcher
:
ワーカー スレッドを作成します。
Dispatcher _workerDispatcher;
Thread _workerThread = new Thread(new ThreadStart(() =>
{
_workerDispatcher = Dispatcher.CurrentDispatcher; // Required to create the dispatcher
Dispatcher.Run(); // Keeps thread alive and creates a queue for work
});
_workerThread.Start();
(メイン スレッドまたは別のスレッドから) ワーカー スレッドに作業を入れます。
// Synchronous work
_workerDispatcher.Invoke(() =>
{
// Do stuff
});
// Asynchronous work (makes most sense for background work)
_workerDispatcher.BeginInvoke(() =>
{
// Do stuff
});
ワーカー スレッドをシャットダウンします。
_workerDispatcher.InvokeShutdown();
_workerThread.Join(); // Wait for thread to shut down
アパートメントの状態を設定する必要があるので使用していますが、 と を使用しnew Thread()
て作成したタスクを使用することもできます。Task.Run()
Task.Factory.StartNew()
を呼び出す必要があることを 100% 確信しているわけではありませんthread.Join()
が、スレッドがシャットダウンされていることは確かです。代わりにTask
通話を使用している場合。task.Wait()
を取得するもう 1 つの方法Dispatcher
は を呼び出すことですが、(後で参照を使用しない場合でも) が使用されるまでは作成されないことDispatcher.FromThread(thread)
に注意することが重要です。Dispatcher
CurrentDispatcher
このアプローチの欠点は、複数のスレッドがキューからアイテムを選択して動作させるために使用できないことです。そのためには、Zaches の回答で説明されているプロデューサー/コンシューマー アプローチを使用する必要があります。ディスパッチャー アプローチを使用すると、特定の広告で作業をキューに入れることができます。