我從你們的討論看到dotnetstep你正試圖組建一個MVC應用程序,但我不認爲我需要看到的是回答你的問題。 Dotnetstep的回答是正確的,但我想詳細說明您在評論中提出的一些其他問題。
我想明白其中的5線程池是從
這只是一個任意數量dotnetstep選擇了未來。該數字將來自web.config文件的processModel> maxWorkerThreads部分。這是ASP.NET可以處理的併發執行請求的數量。這個數字鼓勵開發人員儘量減少請求的執行時間。例如,如果這個數字是5,那麼ASP.NET可以同時處理5個請求。但是如果請求依賴於其他一些I/O操作會發生什麼?如果你需要撥打網絡服務怎麼辦?
在「Sync」場景中,當Request1進入並調用Web服務時,Request1的線程將等待,直到Web服務的響應已經發生。請求2,請求3,請求4和請求5相同。當請求6進入時,服務器將返回HTTP 503響應(「服務不可用」),因爲所有5個線程都在等待Web服務響應。此時,您的服務器無法處理任何其他請求,直到其中一個請求完成並且該線程已返回到線程池。
在「Async」場景中,Request1進入並調用Web服務,Request1的線程不會等待來自Web服務的響應,而是立即返回到線程池。請求2,請求3,請求4和請求5相同。當請求6進入時,服務器具有全部5個線程(假設沒有任何web服務調用已經返回)來處理請求。這是「異步」的好處,因爲它不會阻止你的線程。這樣你可以同時處理更多的請求。
正如你可以清楚地看到這一切取決於你在請求中做什麼。如果請求正在進行需要純粹CPU關注的工作(CPU密集型工作),那麼異步不會對您有所幫助,因爲無論是異步還是同步,CPU都被佔用,並且別無其他。因此,您的請求將不得不等待。注意你在Async操作中正在做的事情。如果所有你做的用於測試目的是:
Thread.Sleep(2000);
那麼你的線程仍然保持佔領無論是同步或異步(只有一個辦法,線程可以入睡,不能入睡,並在同一時間做的工作通過返回到線程池)。
做一些真正異步的事情,例如,從大文件中讀取,你會看到真正的好處或異步與同步。
以及爲什麼它不同於它正在卸載的線程池。
執行I/O請求的線程與提供這些ASP請求的線程不同。在某些情況下,它甚至不是同一臺機器,例如,如果您調用另一臺機器上的Web服務或從某個其他機器上的文件中讀取數據......您就明白了。
更新1:
一點的詳細信息,可以是有益的是,當你有這樣的代碼:
return new Task(() => Thread.Sleep(2000));
如果上面的代碼是由Request1的線程,它就會被卸載到另一個線程(請求1,請求2,請求3或請求4)。而另一個線程會睡覺。所以基本上它會讓你付出更多的代價,因爲你切換了上下文,但是你沒有得到任何回報。因此,由於此處的上下文切換,您的異步版本將比您的同步版本慢。
此外,請記住,無論是同步還是異步(它不會更快),客戶端必須等待的時間幾乎相同。唯一的好處是你的服務器可以處理更多的請求。工作仍然需要以某種方式完成(同步或異步)。
我的問題不清楚嗎?我的答案是否已經存在於別的地方?或者我只是畫一張關閉和選舉票,因爲提到「異步同步」會讓你感到厭惡? – ricksmt
「異步同步」是什麼意思? – Enigmativity
你可以把一些示例代碼? – dotnetstep