3

サーバーアプリでのマルチスレッドのダイナミクスと影響(clrスレッドプールを枯渇させるなど)についてたくさん読んだことがありますが、引数のために、リクエストごとに達成する必要がある正確に4つの非同期プロセスがあるとしましょう私の(asp.net)ページ...ここで、時間がより重要な要素であり、私のサイトで大量のトラフィックが発生するべきではないとしましょう。このシナリオでは、new Thread()アプローチを使用して 4 つのスレッドを生成するのが望ましいThreadPool.QueueUserWorkItem methodですか?

ここでの私の懸念(および私のポイント)は、を使用するとThreadPool method、実際に必要なものよりも大きすぎるスレッドプールが作成される可能性があることです。必要なスレッドが 4 つだけの場合、割り当てられたアプリ ドメイン、clr スレッドの数を最小限に抑えるために、それらを自分で生成することはできませんか?

4

2 に答える 2

2

スレッドの生成は非常にコストがかかるため、待ち時間の長い操作です。スレッドを自分で管理する場合は、合理的ですが必須ではありませんが、カスタムプールを構築する必要があります。

スレッドプールの作業項目を使用しても、同時実行レベルが4になるとは限らないため、危険が伴います。2または3を取得した場合、HTTPリクエストのレイテンシがはるかに長くなります。

私はスレッドプールを使用SetMinThreadsして、スレッドが遅滞なく開始され、常に十分な数があることを確認するために使用します。

于 2012-08-15T15:58:20.553 に答える
1

私は間違いなくアプローチに行きThreadPoolます。まさにこの種のシナリオ向けに設計されています。スレッド プールは、必要なスレッドの数を内部的に管理し、システムに過負荷がかからないようにします。MSDNからの引用:

スレッド プールは、各カテゴリの最小値に達するまで、オンデマンドで新しいワーカー スレッドまたは I/O 完了スレッドを提供します。最小値に達すると、スレッド プールはそのカテゴリに追加のスレッドを作成するか、いくつかのタスクが完了するまで待機することができます。.NET Framework 4 以降、スレッド プールは、単位時間あたりに完了するタスクの数として定義されるスループットを最適化するために、ワーカー スレッドを作成および破棄します。スレッドが少なすぎると、使用可能なリソースを最適に使用できない可能性があり、スレッドが多すぎると、リソースの競合が増える可能性があります。

あなたが本当に偏執的であるなら、手動でそれを制限することができますSetMaxThreads. 手動のスレッド管理を行っても、潜在的なバグが発生するだけです。

.net 4.0 にアクセスできる場合は、さらに魅力的な機能を備えた TPLTaskクラスを使用できます (内部では も使用します)。ThreadPool

于 2012-08-15T12:45:20.027 に答える