2012-03-02 50 views
1

我在這裏閱讀衝突意見。我的意思是,雖然異步方法調用也可以通過用戶看不到的線程池來處理,但這可能會節省資源,因爲底層操作系統能夠在IO調用掛起時掛起這些線程嗎?使用異步方法調用通過.net線程提高性能

+1

大量的線程需要不斷的上下文切換。 – diolemo 2012-03-02 04:27:08

+0

請不要用「.net」等來標題。這就是標籤的用途。 – 2012-03-02 04:42:07

+0

許多現成的線程需要不斷的上下文切換。 – 2012-03-02 08:34:50

回答

1

你是完全正確的。 IO線程不僅被掛起,而且在不需要時它們會被退出。但異步IO並不是解決所有問題的通用解決方案,因此:

  • 異步算法很難編碼。異步代碼比同步變量更復雜且容易出錯
  • IO完成回調在特殊IO線程中工作,程序員必須儘可能保持這些線程儘可能的自由;否則系統會顯着減速。所以,如果你去異步IO準備實施生產者 - 消費者模式實際數據處理
  • 如果你有少於150個並行連接的需求,並且應用程序在PC機上運行,​​那麼同步實現將是一個低懸掛水果提供易於編程和令人滿意的性能同時
+0

+1爲異步的缺點。 – 2012-03-02 08:40:49

+0

儘管如上所述,應該謹慎地進行異步編程。新的5.0功能將使編碼中的異步非常簡單和表達。我建議您閱讀Eric Lippert的文章,瞭解即將發佈的內容:http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two -whence-await.aspx他還說明了一些關於異步的好處。我知道這是未來,但基於這個問答,似乎它可能會有所幫助:) – 2012-03-02 17:12:46

0

理想情況下,如果可能的話,你會使用.net 4.0 System.Threading.Tasks.Parallel類。它將利用多核處理器。

而且很簡單。

0

'異步方法調用也被用戶看不到的線程池處理 - 是的,必須做I/O!

'這可能會節省資源,因爲底層操作系統能夠掛起這些線程,同時IO調用正在等待' - 操作系統能夠在I/O掛起時掛起用戶線程。

在高性能應用程序中,異步獲勝是因爲將更多工作推入內核,以便可以實現更好的線程管理。這確實減少了上下文切換,並且還避免了大量的數據複製。