2013-10-26 53 views
0

許多API正在轉向只暴露異步方法。在需要立即等待這些方法的場景中,有多少性能影響?我錯在假設它導致當前線程等待一個產生的線程完成?還是CLR在這些場景中執行某種魔術,並使它們在同一個線程中執行?當調用立即等待的異步方法時,性能影響有多大?

+1

你的意思是阻止等待,即'task.Wait()',或異步「等待」,即「等待任務」? – Noseratio

+0

'task.Wait()'。我這樣做的方法不能調用'await',因爲它不能被做成'async'。 –

+0

那你爲什麼要調用一個異步方法呢?有沒有同步版本打電話?請向我們展示如何啓動異步方法,具體取決於它是如何啓動的,可能會發生不同的事情。 –

回答

3

通過「異步方法」,我假設你的意思是Task<T>基於異步方法。

所以,如果你有一個方法返回一個Task<T>,你立即調用它的Wait()方法,這會導致在內部WaitHandle對象上等待的電流。該任務很可能在不同的線程上執行,並在完成時發出WaitHandle的信號,釋放等待的線程。沒有優化器可以將此場景轉換爲我所知道的同步調用。

這當然比調用異步方法的同步等價物更多的工作。但是,根據您的使用情況,這可能不會有重大差異。

更重要的問題是,爲什麼要通過阻止調用線程來釋放異步的優點?這通常不是一個好主意,你應該確保你有一個很好的理由來做到這一點。

+0

這是一種情況,除了立即等待任務外別無選擇。具體來說,我在'Global.asax'中的'Application_PostAuthenticateRequest'中執行此操作。 –

+0

@ w.brian,我的經驗在這方面有限,但我認爲你可以通過RegisterAsyncTask在ASP.NET 4.5事件處理程序中使用'async'任務,[更多詳情](http://www.hanselman.com /blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx)。 – Noseratio

+0

實際上,'Task'似乎沒有使用任何'WaitHandle',它使用'ManualResetEventSlim'。但這並沒有太大的區別。 – svick