許多API正在轉向只暴露異步方法。在需要立即等待這些方法的場景中,有多少性能影響?我錯在假設它導致當前線程等待一個產生的線程完成?還是CLR在這些場景中執行某種魔術,並使它們在同一個線程中執行?當調用立即等待的異步方法時,性能影響有多大?
回答
通過「異步方法」,我假設你的意思是Task<T>
基於異步方法。
所以,如果你有一個方法返回一個Task<T>
,你立即調用它的Wait()
方法,這會導致在內部WaitHandle
對象上等待的電流。該任務很可能在不同的線程上執行,並在完成時發出WaitHandle
的信號,釋放等待的線程。沒有優化器可以將此場景轉換爲我所知道的同步調用。
這當然比調用異步方法的同步等價物更多的工作。但是,根據您的使用情況,這可能不會有重大差異。
更重要的問題是,爲什麼要通過阻止調用線程來釋放異步的優點?這通常不是一個好主意,你應該確保你有一個很好的理由來做到這一點。
這是一種情況,除了立即等待任務外別無選擇。具體來說,我在'Global.asax'中的'Application_PostAuthenticateRequest'中執行此操作。 –
@ w.brian,我的經驗在這方面有限,但我認爲你可以通過RegisterAsyncTask在ASP.NET 4.5事件處理程序中使用'async'任務,[更多詳情](http://www.hanselman.com /blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx)。 – Noseratio
實際上,'Task'似乎沒有使用任何'WaitHandle',它使用'ManualResetEventSlim'。但這並沒有太大的區別。 – svick
- 1. 異步/等待會影響tcp服務器的性能嗎?
- 2. 異步操作立即等待
- 3. 不等待調用異步方法
- 4. 淨調用異步方法,並等待
- 5. 等待異步方法在c#調用
- 6. 調用異步方法而不等待
- 7. 異步/等待性能5
- 8. 不要等待正在等待的異步方法內的異步調用
- 9. 等待一個同步方法,其中調用異步方法
- 10. 等待異步方法回調
- 11. 等待非異步方法
- 12. 異步方法並等待
- 13. 異步\等待方法
- 14. 異步/等待+ FromEvent方法
- 15. 等待異步WCF方法
- 16. C#異步/等待 - 限制異步方法調用/鎖定
- 17. 等待異步HTTP請求的響應,無異步/等待
- 18. 在不等待非異步方法的情況下調用異步方法?
- 19. Node.js - 等待多個異步調用
- 20. 等待多個異步調用完成?
- 21. 等待使用NSCondition的異步方法
- 22. 異步調用不等待
- 23. AngularJS:等待異步調用
- 24. Silverlight等待異步調用
- 25. 當我不需要響應時,無需等待即可使用異步
- 26. 等待異步響應?
- 27. 調用getter方法時等待異步結束?
- 28. 異步等待永不結束,但立即同步運行
- 29. 調用異步方法,然後等待它,有什麼好處?
- 30. 在MVC中不使用異步/等待的影響4
你的意思是阻止等待,即'task.Wait()',或異步「等待」,即「等待任務」? – Noseratio
'task.Wait()'。我這樣做的方法不能調用'await',因爲它不能被做成'async'。 –
那你爲什麼要調用一個異步方法呢?有沒有同步版本打電話?請向我們展示如何啓動異步方法,具體取決於它是如何啓動的,可能會發生不同的事情。 –