最近、.NET 4.0 の TPL に関するポッドキャストをたくさん耳にしました。それらのほとんどは、作業が GUI スレッドに干渉しないようにタスクを使用して、画像のダウンロードや計算の実行などのバックグラウンド アクティビティについて説明しています。
私が取り組んでいるコードのほとんどは、複数のソースからの作業項目をキューに入れ、順番に処理する必要がある、複数のプロデューサー/単一のコンシューマーのフレーバーを持っています。1 つの例は、ファイルまたはデータベースへの最終的な書き込みのために、複数のスレッドからのログ行が 1 つのキューに順番に並べられるロギングです。単一のソースからのすべてのレコードは順序どおりに維持する必要があり、同じ時点からのレコードは、最終的な出力で互いに「近い」必要があります。
したがって、複数のスレッドまたはタスク、またはすべてがキューラーを呼び出しています。
lock( _queue ) // or use a lock-free queue!
{
_queue.enqueue( some_work );
_queueSemaphore.Release();
}
専用のワーカー スレッドがキューを処理します。
while( _queueSemaphore.WaitOne() )
{
lock( _queue )
{
some_work = _queue.dequeue();
}
deal_with( some_work );
}
これらのタスクのコンシューマー側専用のワーカー スレッドを用意することは、常に合理的であるように思われます。代わりに、TPL の構造を使用して将来のプログラムを作成する必要がありますか? どれ?なんで?