在 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 的工作方式相同吗?