對於長時間運行操作,如果將asp.net線程釋放到服務器的其他請求。在哪個線程上執行長時間運行的操作,以及在完成時如何獲得asp.net線程。ASP.NET中的線程處理異步等待操作
4
A
回答
6
正如我在我的博客上描述的那樣,long-running I/O operations do not require a thread at all。相反,它們使用自然異步I/O,它不需要線程。
設備驅動程序通常使用DMA,這允許設備直接讀/寫主系統RAM。 .NET通過作爲線程池一部分的IOCP(I/O完成端口)對此方法進行了補充,允許每個AppDomain的單個線程(或極少線程)等待大量的I/O操作。
要回答你的問題的後半部分,異步方法將恢復與請求上下文,但它可能會或可能不會是同一個線程是在await
之前。更常見的情況是當I/O操作完成時,它向IOCP發出信號,這需要線程池線程進行一些內務處理(將任務標記爲完成等),然後該同一線程進入ASP.NET請求上下文並恢復執行處理程序。這不是總是發生 - 有時一個線程切換是必要的 - 但這是最常見的情況。
1
要回答你的問題,所有線程都來自線程池。
可以這樣給出一個示例場景,當服務器收到請求時,將從池中提取可用線程來爲請求提供服務。
然後你產生一個新的線程(通過Async
或其他手段)。現在從池中抽取一個新線程來運行您的Async
正文的請求。
同時,原始線程被釋放到池中並返回處理另一個請求。
當線程完成時,它從池中取回另一個線程(可能與原始線程不同)並完成請求。
由於您阻止一個線程(來自同一個池),因此如果此進程受到CPU限制,則這會浪費時間。但是,IO綁定操作可以像這樣處理,因爲它們不使用線程。
相關問題
- 1. 等待異步操作
- 2. 等待事件處理程序異步
- 3. 異步等待處理程序死鎖
- 4. 異步/等待與線程
- 5. C#異步等待Task.delay中的操作
- 6. 即使異步I/O操作正在等待,只有處理io_service的線程正在等待
- 7. ASP.NET異步調用的問題,等待處理程序返回
- 8. 十字UI線程異步與無效操作等待
- 9. 跨線程操作無效使用異步/等待在VSTO
- 10. iOS線程等待操作
- 11. ASP.Net自定義處理程序中的異步操作
- 12. 長處理線程異步ASP.NET網頁
- 13. 循環異步等待操作奇怪
- 14. C#異步操作不等待wp8.1
- 15. 如何等待所有異步操作?
- 16. 等待完成異步操作
- 17. 異步操作立即等待
- 18. 如何異步/等待redux-thunk操作?
- 19. 節點 - 如何等待異步操作?
- 20. asio - 等待異步操作完成
- 21. 等待異步操作完成
- 22. 等待節點異步操作
- 23. 等待異步操作完成android
- 24. python gio等待異步操作完成
- 25. C#等待異步操作完成
- 26. 異步/等待和WebException處理
- 27. 等待主線程停止,直到任務被異步線程處理
- 28. Windows Store應用程序 - 同步等待異步操作
- 29. 同步操作使用異步/等待(主要是留在UI線程上)
- 30. ReactNative AsyncStorage結合異步/等待。 setItem操作需要「等待」嗎?
謝謝Stephen Cleary! – Sunny
如果它不是I/O操作會怎麼樣。如果它是一個在一個函數中執行並且消耗很多時間的業務邏輯。它不會創建一個新的線程。 – Sunny
@Sunny:不可以。如果你在沒有await的情況下使用'async',那麼代碼就直接在調用線程上運行。如果使用'await Task.Run',那麼'Task.Run'(*不是'async' /'await')將使用單獨的線程池線程(注意:這不建議在ASP.NET上使用)。 –