关闭TcpClient后NetworkStream也要手工关闭

最近我写的一个客户端程序出了问题,即很多用户同时掉线时(例如在打开很多客户端的电脑上拔掉网线),有很小的概率服务器会出现异常。异常的Trace显示,这是对已经关闭的TcpClient写入数据时导致的。具体是调用NetworkStream.BeginWrite方法时,出现InvalidOperationException,消息是“写操作不支持”。而这个异常甚至没有在BeginWrite的MSDN文档中出现。

我查看了一下代码,主要原因是很多用户同时掉线,很可能同时出现心跳停止。在用户退出时,会向所有其他用户发送通知消息。这时,如果一个用户退出时向其他用户发送消息,而那个用户正好也在退出,其TcpClient已经关闭,向其NetworkStream发送消息时就会出问题:出现开始所说的异常。(概率小的原因在于,一切都发生在几个调用之间)

解决方法,即TcpClient关闭时,也要手工关闭从其获得的NetworkStream(调用Close方法)。这时,如果还有调用,则会出现ObjectDisposedException,而这个异常是捕获的。所以,解决这个问题所做的改动就是在底层公共通信库里添加一句:m_stream.Close()。一切正常了!

后来看MSDN,微软也说,NetworkStream必须随TcpClient一起关闭,关闭TcpClient并不代表NetworkStream也关闭了。写C#网络程序的引以为戒。

转载于:https://www.cnblogs.com/leading/archive/2012/10/24/networkstream_must_be_closed_manually_right_after_closing_tcpclient.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值