[解決済み] ThreadPool.QueueUserWorkItem vs Task.Factory.StartNew
質問
以下の違いは何ですか?
ThreadPool.QueueUserWorkItem
対
Task.Factory.StartNew
上記のコードが、ある長時間実行されるタスクに対して500回呼ばれた場合、スレッドプールのスレッドはすべて占有されるのでしょうか?
それとも、TPL (2番目のオプション) は、プロセッサの数より少ないか等しいスレッドを占有するのに十分賢いのでしょうか?
どのように解決するのですか?
TPLで長時間実行するタスクを開始する場合は、以下のように指定する必要があります。
TaskCreationOptions.LongRunning
と指定すると、その意味は
は
はスレッドプールにスケジュールされないことを意味します。 (EDIT: コメントで指摘されているように、この
は
はスケジューラー固有の決定であり、確実な保証ではありませんが、賢明な運用スケジューラーであれば、スレッドプールで長時間実行するタスクのスケジューリングは避けてほしいと願っています)。
スレッドプール上に多数の長く実行するタスクを自分でスケジュールすることは、間違いなくお勧めしません。最近、スレッドプールのデフォルトのサイズはかなり大きいと思いますが (この方法でしばしば悪用されるため)、基本的にこのような使い方はすべきではありません。
スレッドプールのポイントは 短い タスクが、実際に実行されている時間に比べて、新しいスレッドを作成することで大きな打撃を受けることを避けるためです。タスクが長時間実行される場合、新しいスレッドを作成することによる影響はいずれにせよ比較的小さくなります - そして、スレッドプールのスレッドを使い果たす可能性はありません。(今ではその可能性は低くなっていますが、私は は を経験しました)。
個人的には、もしオプションがあれば、私は間違いなく TPL を使用します。
Task
API は非常に素晴らしいものです。
を実行します。
は、タスクが長時間実行されることをTPLに伝えることを忘れないでください。
EDIT: コメントで指摘されているように、PFX チームのブログ記事も参照してください。 TPL とスレッド プールのどちらを選択するか :
結論から言うと、CLRチームのThreadPool開発者がすでに述べていることを再度説明します。
Task is now the preferred way to queue work to the thread pool.
EDIT: また、コメントから、TPLでは、以下のように使用できることを忘れないでください。 カスタムスケジューラ を使用できることも忘れてはいけません。
関連
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である
-
[解決済み】非同期プログラミングとマルチスレッドの違いは何ですか?
-
[解決済み】Parallel.ForEachとTask.Factory.StartNewの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C#で四捨五入する方法
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み] 関数を終了するには?
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015