2011-01-11 32 views
7

可以在.NET的異步回調中進行繁重的處理,在返回之前持續多秒鐘處理它們?還是我剝奪了OS /重要資源的運行時間?確定要在異步回調中進行繁重的處理嗎?

例如,考慮TcpListener.BeginAcceptSocket。我的回調通過調用EndAcceptSocket開始,然後花費一段時間接收數據,然後關閉套接字並返回。這是它是如何使用的,或者我希望在自己的線程上做額外的處理?

+0

我促請你看看的Rx(無擴展名),這使得異步編程一個美麗的晚上散步在公園! http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx – gideon 2011-01-14 04:31:41

+0

一些有用的Rx鏈接:http://rxwiki.wikidot.com/這裏是我寫的小代碼異步更新列表框每次我鍵入在一個文本框中,並將其節制0.5秒。請參閱http://stackoverflow.com/questions/4655619/simple-rx-code-silently-fails-in-windows-forms-only-during-debugging-in-visual-st – gideon 2011-01-14 04:33:56

回答

1

是的,這是怎麼插座異步(TCP客戶端,監聽器等)設計的。您應該始終確保您調用最終的aysnc方法,然後執行您所需的任何處理。如果不調用EndAccept(),EndSEnd(),EndReceive()等等方法,可能會導致內存泄漏,所以最好遵循一下。

所使用的線程是沒有什麼不同,如果你有手動纏繞了一個後臺線程自己,並INFACT desinged用於幾秒鐘的甚至是「長期作戰」。相信我,你不需要花費那麼長時間才能在調度或GUI線程上運行的任何事情。

我有超過90個基於移動的系統,它們使用異步套接字通信到服務器,它做的很出色:比Web服務快得多(記住所有的Web協議都在Socket上運行),容易檢測錯誤等等等等

我做同樣的我的服務器代碼(與其他一些WCF混合中間件和後臺通信件),那就是我們已經使用了最可擴展的通訊。你必須在上面做一個Google,但是有一個人使用這種技術發佈了他的測試結果,並且他能夠支持只有11個線程的1000個併發通信。不錯。從MS

服務器例如:從MS http://msdn.microsoft.com/en-us/library/fx6588te.aspx

客戶例如:http://msdn.microsoft.com/en-us/library/bew39x2a.aspx

它需要比這些更得到它「完善」,但這是一個好的開始。

+1

http://上的文章www.codeproject.com/KB/threads/threadtests.aspx似乎表明,如果在線程池線程中執行長時間處理(例如異步調用完成處理程序),則.NET ThreadPool會出現性能問題。這個問題是否對您不可見? – Sander 2011-01-11 06:02:39

1

我重複了CodeProject article on this topic的實驗,發現.NET 4的結果與2003年描述的結果類似。請注意,文章並未實際列出有問題的部分的結果,但據我瞭解,主要問題依然存在。

我重用從CodeProject上的文章的代碼 - 只要下載自己運行該測試或試驗。

測試將嘗試使用10個並行線程計數高,因爲它可以在1秒。

使用10後臺線程(即new Thread()

 
T0 = 4451756 
T1 = 4215159 
T2 = 5449189 
T3 = 6244135 
T4 = 3297895 
T5 = 5302370 
T6 = 5256763 
T7 = 3779166 
T8 = 6309599 
T9 = 6236041 
Total = 50542073 

使用10線程池的工作項

 
T0 = 23335890 
T1 = 20998989 
T2 = 22920781 
T3 = 9802624 
T4 = 0 
T5 = 0 
T6 = 0 
T7 = 0 
T8 = 0 
T9 = 0 
Total = 77058284 

請注意,只有4線程池工作項目進行的10過實際執行在1秒的時間片!這是一個四核CPU,所以每個核心只有一個線程。在前四個完成後執行的其他任務以及由於分配的1秒已經過期,他們沒有增加其計數器。

這裏的結論是:用了很長的任務,ThreadPool會讓一些任務等待在別人後面!因此,我強烈建議不要在ThreadPool任務中執行任何長處理(例如異步完成處理程序)。否則,如果數據處理佔用CPU,可能會使更重要的異步調用無法完成,或者如果只有某些任務執行了大量處理,則性能可能會非常不穩定。

使用自定義線程池實現從文章

 
T0 = 7175934 
T1 = 6983639 
T2 = 5306292 
T3 = 5078502 
T4 = 3279956 
T5 = 8116320 
T6 = 3262403 
T7 = 7678457 
T8 = 8946761 
T9 = 8500619 
Total = 64328883