2011-08-02 6 views
4

AsyncControllerは、ASP.NETワーカースレッドの使用をどのくらい避けますか?私は、イベントベースのパターン(擬似コード)を使用する場合:AsyncControllerはASP.NETワーカースレッドの使用をどのように避けますか?

[AsyncTimeout(60000)] 
public void WaitForWakeUp() 
{ 
    AsyncManager.OutstandingOperations.Increase(); 
    EventRaisedElsewhere += 
    state => 
    { 
     AsyncManager.OutstandingOperations.Decrease(); 
     return Content("Woke up because of " + state); 
    }; 
} 

...その後Clay Lenhartsによると、それは、ASP.NETのワーカースレッドを使用しません。これはどのように可能ですか?

AsyncControllerソースコードを少し見ましたが、何かを理解できませんでしたが、IAsyncResultを多く使用し、QueueUserWorkItemを使用する点が異なります。

しかし、どのようにBeginInvokeQueueUserWorkItemではなく、はASP.NETワーカースレッドを使用しますか?確かにどちらもスレッドプールスレッドを使用しますが、ASP.NETワーカープロセスには必ず1つのスレッドプールしかありませんか?

MSDN、

によれば、Webサーバは、着信要求を処理するためにスレッドプール(ワーカースレッド )とスケジュールからスレッドを取得します。この作業者 スレッドは、非同期操作を開始します。

ワーカースレッドは、別の Web要求を処理するためにスレッドプールに返されます。

非同期操作が完了すると、ASP.NETに通知されます。 はまだ上で実行するスレッドが必要になります非同期操作を開始よう

は、しかし、非自明な何のために、それが聞こえます。非常に単純な場合(BCLを使用してWebコンテンツをダウンロードする場合など)は完全に解放され、完全にIOCPにバインドされますか?

AsyncControllerを使用して実装されたこれらのチャットサーバーのすべてが表示され、「新しいメッセージを待つ」場合は、スレッドプール以外のスレッドでどのように行うことができないのか分かりません。

答えて

0

あなたは正しいと思います。 asp.netスレッドを使用して非同期呼び出しを開始しますが、そのスレッドは&がプールに戻って終了します。非同期プロセスは、asp.netに結果を処理するためのスレッドが必要であることを通知する前に、ワーカースレッドプールの別のスレッドで実行されます。

asp.netスレッドプールは着信接続を制限するので、できるだけ早くこれらを解放すると、より多くの着信接続をより迅速に処理できます。

少なくともそれは私がそれを見る方法です。

私はそれが完全に真実だとは思わない。フレームワークで定義されているバックグラウンドスレッドプールは1つだけですが、他のスレッドを好きなだけ作成し、バックグラウンドスレッドプールとは異なる独自のスレッドプールを作成することができます。

私はそれがここで起こっていると信じています。要求を扱うワーカースレッドは少数です。これらのワーカースレッドは、非同期要求を処理するためにバックグラウンドプールにスレッドを生成します。

シモン

+1

申し訳ありませんが、これはあまりにも曖昧です。 w3wpワーカープロセスには、ちょうど1つのCLRスレッドプールがありますか?では、上記の「ワーカースレッドプール」がどのスレッドプールを参照していますか?このスレッドプールは、着信HTTP要求を処理するためにスレッドがプルされるスレッドプールと同じですか?その場合、なぜアクションメソッドの呼び出し側スレッドをそのスレッドプールに戻してからすぐに新しいスレッドを取得するのですか。また、スレッドがスレッドプールに戻された場合、どのように「待機」が達成されますか? – clonedog

+0

上記の編集を追加しましたが、わかりません。 –

関連する問題