關閉TcpClient后NetworkStream也要手工關閉


最近我寫的一個客戶端程序出了問題,即很多用戶同時掉線時(例如在打開很多客戶端的電腦上拔掉網線),有很小的概率服務器會出現異常。異常的Trace顯示,這是對已經關閉的TcpClient寫入數據時導致的。具體是調用NetworkStream.BeginWrite方法時,出現InvalidOperationException,消息是“寫操作不支持”。而這個異常甚至沒有在BeginWrite的MSDN文檔中出現。

我查看了一下代碼,主要原因是很多用戶同時掉線,很可能同時出現心跳停止。在用戶退出時,會向所有其他用戶發送通知消息。這時,如果一個用戶退出時向其他用戶發送消息,而那個用戶正好也在退出,其TcpClient已經關閉,向其NetworkStream發送消息時就會出問題:出現開始所說的異常。(概率小的原因在於,一切都發生在幾個調用之間)

解決方法,即TcpClient關閉時,也要手工關閉從其獲得的NetworkStream(調用Close方法)。這時,如果還有調用,則會出現ObjectDisposedException,而這個異常是捕獲的。所以,解決這個問題所做的改動就是在底層公共通信庫里添加一句:m_stream.Close()。一切正常了!

后來看MSDN,微軟也說,NetworkStream必須隨TcpClient一起關閉,關閉TcpClient並不代表NetworkStream也關閉了。寫C#網絡程序的引以為戒。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM