在我的某些異步tcp服務器代碼中,偶爾會發生錯誤,導致進程消耗整個系統的內存。在查看日誌,事件查看器和一些MS docs時,如果「調用應用程序多次對同一客戶端進行異步IO調用,那麼如果遠程客戶端停止I/O的結尾,您可能會看到堆碎片和私人字節增加, O「,這會導致System.Threading.OverlappedData結構和字節數組在內存使用率和釘扎方面出現尖峯。如何停止異步tcp .NET代碼使用整個系統的資源
知識庫文章建議的解決方案是「用異步IO設置未完成緩衝區(發送或接收)數量的上限」。
這是怎麼回事?這是指發送到BeginRead的字節[]嗎?那麼解決方案是簡單地用信號包裝訪問byte []的嗎?
編輯:信號量控制訪問字節緩衝區或只是有靜態大小的字節緩衝池是兩種常見的解決方案。我仍然存在的一個問題是,當這個異步客戶端問題發生(可能實際上是一些奇怪的網絡事件)時,使用信號量或字節緩衝池將會阻止我耗盡內存,但它不能解決問題。我的緩衝池可能會被問題客戶端吞併,實際上鎖定了正確的功能合法客戶端。編輯2:遇到這個偉大的answer。基本上它顯示瞭如何手動取消固定對象。儘管異步TCP代碼留在了幕後運行時規則中,但可能會在使用之前明確固定每個緩衝區,然後在塊末尾或終點處取消固定,從而覆蓋該代碼。我試圖找出現在...
可能的重複:http://stackoverflow.com/questions/236171/net-does-not-have-reliable-asynchronouos-socket-communication – Dennis
這是關於使用信號封裝調用BeginRead。 – mikalai
也許這是一個很好的理由來剖析代碼... – gsscoder