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
を使用する点が異なります。
しかし、どのようにBeginInvoke
とQueueUserWorkItem
ではなく、はASP.NETワーカースレッドを使用しますか?確かにどちらもスレッドプールスレッドを使用しますが、ASP.NETワーカープロセスには必ず1つのスレッドプールしかありませんか?
MSDN、
によれば、Webサーバは、着信要求を処理するためにスレッドプール(ワーカースレッド )とスケジュールからスレッドを取得します。この作業者 スレッドは、非同期操作を開始します。
ワーカースレッドは、別の Web要求を処理するためにスレッドプールに返されます。
非同期操作が完了すると、ASP.NETに通知されます。 はまだ上で実行するスレッドが必要になります非同期操作を開始よう
は、しかし、非自明な何のために、それが聞こえます。非常に単純な場合(BCLを使用してWebコンテンツをダウンロードする場合など)は完全に解放され、完全にIOCPにバインドされますか?
AsyncController
を使用して実装されたこれらのチャットサーバーのすべてが表示され、「新しいメッセージを待つ」場合は、スレッドプール以外のスレッドでどのように行うことができないのか分かりません。
申し訳ありませんが、これはあまりにも曖昧です。 w3wpワーカープロセスには、ちょうど1つのCLRスレッドプールがありますか?では、上記の「ワーカースレッドプール」がどのスレッドプールを参照していますか?このスレッドプールは、着信HTTP要求を処理するためにスレッドがプルされるスレッドプールと同じですか?その場合、なぜアクションメソッドの呼び出し側スレッドをそのスレッドプールに戻してからすぐに新しいスレッドを取得するのですか。また、スレッドがスレッドプールに戻された場合、どのように「待機」が達成されますか? – clonedog
上記の編集を追加しましたが、わかりません。 –