作業項目のグローバルカウンタを保つには、それを保護することを目的としキューに入れられ、:
int runningTasks = 0;
object locker = new object();
タスクはカウンタをインクリメント追加されるたびに:
lock(locker) runningTasks++;
System.Threading.ThreadPool.QueueUserWorkItem(x => MyMethod(param1, param2, param3, param4, param5));
をMyMethod
減少の終わりにカウンタと信号をメインスレッド:
lock(locker)
{
runningTasks--;
Monitor.Pulse(locker);
}
メインスレッド(これはGUIスレッドではないと仮定します)。
lock(locker)
{
while(runningTasks > 0)
{
Monitor.Wait(locker);
UpdateGUI();
}
}
このようにして、保留中のすべてのタスクが完了するのを待つこともできます。
待つ必要がない場合は、MyMethod
が終了したら、メインスレッドを完全にスキップして、UpdateGUI
を呼び出して更新をGUIスレッドに転送してください。内部MyMethod
あなたがそうでなければ、あなたが安全にGUIを更新することはできませんDispatcher.BeginInvoke
(WPF)またはControl.BeginInvoke
(リサイズ)のいくつかのフォームを持っている必要があり
注意!
「MyMethod」内から「Control.Invoke」を呼び出して、デリゲートの実行をUIスレッドにマーシャリングします。 –
なぜ「タスク」とその継続を使用しないのですか? –
@BrianRasmussen:はい、さらに良い! –