本 Pro ASP.NET MVC 4 には、非同期アクションの例があります。
public class RemoteDataController : AsyncController
{
public async Task<ActionResult> ConsumeAsyncMethod() {
string data = await new RemoteService().GetRemoteDataAsync();
return View("Data", (object)data);
}
}
public class RemoteService
{
public async Task<string> GetRemoteDataAsync() {
return await Task<string>.Factory.StartNew(() => {
Thread.Sleep(2000);
return "Hello from the other side of the world";
});
}
}
私の質問は次のとおりです。タスクは、リクエストの処理にも使用されるスレッドプールのスレッドを使用するだけではありませんか?
同期 I/O バウンド メソッドがあるとします。このメソッドを Task.Run で呼び出してアクションで await しても、I/O バウンド メソッドのタスクが要求処理に使用できなくなったため、同時に処理できる要求が増えることはないと思います。または、リクエスト専用の別のスレッドプールがあり、アクションで Task.Run を使用すると、自動的に別のスレッドプールが使用されますか? 私が考えさせられたのは、この質問です:トラフィックの多いシナリオで ASP.NET で ThreadPool.QueueUserWorkItem を使用する場合、多かれ少なかれ、ライブラリからの非同期メソッドのみを使用する必要があり、これらのライブラリは独自のスレッド プールを使用します。
動作を設定することは可能ですか? ASP.NET WebForms でも同じように機能しますか?