SocketAsyncEventArgs对一些 IO完成事件的影响

在利用SocketAsyncEventArgs编写服务器端通信服务时,遇到了一个相当奇怪的问题,服务器端强制与客户端进行连接断开时,无法断开。

断连接是利用了SocketAsyncEventArgs的IO完成事件进行异步连接断开,这种断连接曾经起过作用,后来增加了连接断开后的会话通知处理,即把有相关引用的会话通知给其他业务线程,告诉业务线程连接已经断开了,就开始出问题了。

分析原因,其实是习惯的编程模型引起的,在.net的经典编程模型中,作为托管资源其引用可以在多个线程之间互相引用,并且是线程安全的,而SocketAsyncEventArgs作为.net中TCP通信的一个高性能的产物,他的设计目的就是减少对象分配和线程调度引起的资源损耗,他对线程之间的通知就相当敏感了,也就是当这个东西在多个线程之间调用时,就会引起副作用,并且SocketAsyncEventArgs对垃圾回收器相当不敏感,没有查阅到相关资料,使用时最好手工释放掉资源。作为这种很不同于常规类的类,使用时尽量减少其关联到其他资源上,否则很可能因为其他资源的回收或其他问题,造成IO完成事件无法被通知。

对比出了这个类的怪异性,就可以通过第三方辅助类,来并行实现想要的信息的处理,而只让SocketAsyncEventArgs干他所擅长的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值