2012-04-24 13 views
13

先日、長期実行タスクの場合、.NETのスレッドプールまたはタスク並列を使用する代わりに手動でスレッドを作成することをお勧めします。私は本当に長時間実行されているIOタスクのために、C#スレッディングについて学んでいるので、誰かが私を啓発したいと思っています。前もって感謝します。長時間実行されているプロセスでは、スレッドプールの代わりに手動でスレッドを実行する方が良いですか?

+1

この質問を検討してください:http://stackoverflow.com/questions/230003/thread-vs-threadpool –

答えて

7

ThreadPoolスレッドは、スレッドプールからの新しいリクエストを処理するために再スケジュールされる可能性があるため、軽量で安価であるため、他の操作のために同じスレッドを再スケジュールすることもできます。最小スレッド数(ThreadPool.SetMinThreads())であるため、新しい要求が来るまで有効になります。したがって、これは複数の軽量操作のための良い解決策です。たとえば、数秒ごとに別々の/新しいスレッドを作成する必要があります。 MSDNマガジンの

非常に良い記事:スレッドの最小数に達するとDedicated thread or a Threadpool thread?

は、スレッドプールは、スレッドの数は、500ミリ秒ごとに1に作成されて 制限することを目指しています。 これはインテリジェントなメカニズムであり、 の新しいスレッドを作成するのにかかるコストがかかるのを避け、複数のスレッドプールスレッドがその期間内に解放された になる可能性があります。 .NET 4.0以降

- タスクライブラリをパラレルには、手動スレッド管理と同期のための良好な高レベルの抽象化と代替手段ですので、あなたのコードは、エラーが発生しにくいだろう。だからちょうどcreate a TaskTaskCreationOptions.LongRunning、私はこれがメインテナビリティの観点からアプリケーションアーキテクチャに最適な投資と考えています。

便利な読書:

+0

あなたの指示に非常に感謝します。 – user1193665

14

真です。スレッドプールは小さな作業単位用に最適化されており、スレッドプールスレッドを保持することで他の作業に干渉することがあります。

私の経験則は、操作に1秒以上かかる場合は、スレッドプールスレッド上にあってはならないということです。それはおそらくかなり長いでしょう。

これは文書化されていませんが、Taskを​​で開始すると、タスクを実行する新しいスレッドが開始されます。

ほとんどのIOタスクでは、実際に使用するはずのフレームワークメソッドの非同期バージョンがあります。これらはカーネル関数を使用し、スレッドをブロックしないことを意味します。

いつものように、私はJoe Albahari's free ebook、 、それに続いてJoe Duffy's Concurrent Programming on Windowsと読むことをお勧めします。後のページは1000ページですが、役に立つ情報が満載です。

+0

私が使用する基準は、スレッドが何かが起こるのを待っているか、別のスレッドが待っているかもしれない何らかの特定のアクションを実行する、かなりの時間を費やすかどうかです。 – supercat

関連する問題