先日、長時間実行されるタスクの場合、.NETのスレッドプールやタスク並列を使用するのではなく、手動でスレッドを作成するのが最善の策であると読みました。特に長時間実行されるIOタスクのために、c#スレッドについて学んでいるので、誰かに教えてもらいたいです。前もって感謝します。
2 に答える
それは本当です。スレッド プールは小さな作業単位用に最適化されており、スレッド プールのスレッドを保持することで他の作業に干渉できます。
私の経験則では、操作に 1 秒以上かかる場合は、スレッド プール スレッドにすべきではありません。それはおそらくかなり長いです。
これは文書化されていませんが、で開始するTask
とTaskCreationOptions.LongRunning
、タスクを実行するために新しいスレッドが開始されます。
ほとんどの IO タスクには、実際に使用する必要がある非同期バージョンのフレームワーク メソッドがあります。これらはカーネル関数を利用し、スレッドをブロックしないことを意味します。
いつものように、Joe Albahari の無料の電子ブックを読んだ後、Joe Duffy の Concurrent Programming on Windowsを読むことをお勧めします。後者は 1000 ページの長さですが、役に立つ詳細が満載です。
そうです、ThreadPool スレッドは軽量で安価です。ThreadPool からの新しい要求を処理するように再スケジュールできるため、スレッド操作が完了するとすぐに、ThreadPool は他の操作のために同じスレッドを再スケジュールできます。また、最小スレッド数で操作できます。 ( ThreadPool.SetMinThreads() ) であるため、新しいリクエストが来るまでそれらは有効です。したがって、これは複数の軽量操作に適したソリューションです。たとえば、数秒ごとに個別の/新しいスレッドを作成する必要があります。
MSDN マガジンの非常に優れた記事:専用スレッドまたはスレッドプール スレッド?
スレッドの最小数に達すると、スレッド プールは、作成されるスレッドの数を 500 ミリ秒あたり 1 つに制限しようとします。これはインテリジェントなメカニズムであり、その期間内に複数のスレッド プール スレッドが解放される可能性がある場合に、新しいスレッドを作成するための高価なコストを回避します。
.NET 4.0 - タスク並列ライブラリは、手動のスレッド管理と同期の優れた高レベルの抽象化および代替であるため、コードでエラーが発生しにくくなります。したがって、 TaskCreationOptions.LongRunningを使用してタスクを作成するだけです。これは、保守性の観点から、アプリケーション アーキテクチャへの最良の投資になると思います。
役に立つ読み物: