2011-02-10 6 views
3

サーバーサイドのデータベース呼び出しを最適化するために、System.Threading.Tasks.Taskを使用して複数のデータベース呼び出しを並列化し、Task.WaitAll()を使用してすべての結果を取得し、それらをパッケージ化することにしましたWCF経由でクライアントに送信します。これは、Visual Studio(cassini)のdev Webサーバーでテストするとうまくいくようですが、IISにデプロイするとうまくいきません。クライアント呼び出し(ファイアバグ付き)をプロファイリングすると、呼び出しはIISに送られますが、対応する呼び出しはSQL Serverに送信されません。WCFのTPLタスクを使用する

誰でもこれを経験しましたか? IIS内のタスクの使用には制限がありますか?

答えて

3

ただし、タスクを使用すると、ThreadPoolのタスクがスケジュールされます。既定では、IISはIISプロセス全体に対して単一のスレッドプールを共有します(特に、ビジー状態のサーバーではスレッド飢餓が発生する可能性があります)。つまり、タスクを処理するときにThreadPoolの使用に関する同じガイダンスが適用されます。 this post for detailsを参照してください。

これが問題であるかどうかを確認するには、少なくともテストとして、TaskCreationOptions.LongRunningヒントを持つすべてのTaskインスタンスを生成できます。これにより、デフォルトのTaskSchedulerは、ThreadPoolスレッドを使用するのではなく、独自の専用(新規)スレッドでタスクを作成します。これは長期的な解決策としては良い考えではありませんが、問題の原因となっているスレッドプールの飢餓状態を確認できます。そうであれば、カスタムTaskSchedulerを使用してこの操作のスレッド/タスクを管理するなど、他のオプションを決定することができます。

+0

ありがとうリード - 良い情報です。私はかなりスレッドの飢餓ではないと確信していますが、もう少し調査する必要があります。私が前進するにつれて、私の発見を発表します。 –

+1

@arch結果はありますか?私は似たような問題を抱えていて、これの結果は何か不思議です。 – Tyson

関連する問題