4

おそらく、.NET Framework は、ASP.NET 要求を処理するために使用されるスレッドのプール (.NET 4.5 のデフォルトは 5,000) を維持します。実行時間の長いリクエストの同時実行性が高い大規模なアプリケーションは、スレッド スタベーションと呼ばれる状態につながる可能性があると言われています。したがって、要求スレッドを解放するために、待ち時間の長い呼び出しに対して非同期要求を行う必要があります。

しかし、非同期要求は、とにかくスレッド プールから別のスレッドを生成して、その作業を完了するのではないでしょうか? 新しいスレッドは要求スレッド プールとは異なるプールから取得されますか? また、作成できるこれらのスレッドの数に制限はありますか?

4

1 に答える 1

2

しかし、非同期要求は、とにかくスレッド プールから別のスレッドを生成して、その作業を完了するのではないでしょうか?

はい。ただし、非同期作業が完了した後でのみ可能です。作業が行われている間 (これは通常、ディスクまたはネットワークを待機することを意味します)、非同期コードはスレッドをブロックしません。

新しいスレッドは要求スレッド プールとは異なるプールから取得されますか? また、作成できるこれらのスレッドの数に制限はありますか?

ASP.NET 用の個別のスレッド プールはありません。非同期コードと ASP.NET は同じスレッド プールを使用します。つまり、同じ制限も共有します。

また、スレッドの制限だけが問題ではありません (問題がある場合は、呼び出しThreadPool.SetMaxThreads()て増やすことができます)。その他の問題は、各スレッドが 1 MB のメモリを使用することです。これは、32 ビット アプリケーションでは特に問題になります。また、同時に実行するスレッドが多すぎると、コンテキストの切り替えが発生するため、非効率的です。

于 2013-06-05T21:22:07.190 に答える