在書臨ASP.NET MVC 4有一個異步操作的例子:ASP.NET MVC什麼線程池用於自定義任務?
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調用此方法並在我的操作中等待不會導致可以同時處理更多的請求,因爲I/O綁定方法的任務不再可用於請求處理。還是有一個單獨的線程池只爲請求和使用Task.Run中的動作自動使用不同的?我想到的是這個問題:Using ThreadPool.QueueUserWorkItem in ASP.NET in a high traffic scenario答案或多或少只有來自庫的異步方法應該被使用,這些庫使用自己的線程池。
是否可以配置行爲?它是否以與ASP.NET WebForms相同的方式工作?
我相信你在這裏是故意的簡單化,但我認爲這意味着沒有線程被使用是有點危險的。沒有*線程池線程正在被使用,但取決於正在完成的工作,系統上可能還有其他線程正在使用。 'Task.Delay',具體來說不會需要一個線程,但還有其他的東西可能。然而,從網絡應用的角度來看,是的,這將是「無線」的工作,所以沒有錯,只是不完全準確。 –
@ChrisPratt:我的意思是沒有線程正在使用該請求。在系統(和應用程序)的其他地方有各種線程在做事情,如果你阻塞了請求線程,那些相同的線程仍然會在那裏做同樣的事情。 即使'Task.Delay':BCL實際上有一個負責所有管理定時器的「定時器線程」,所以有一個用於定時器的BCL線程。但它是整個AppDomain中的一個線程,而不是每個定時器。同樣的原則在這裏:我們正在避免每個請求都需要額外線程的情況。 –