msdn中示例Socket.AcceptAsync如何避免无限递归

.Net技术 码拜 9年前 (2015-11-02) 1374次浏览
msdn上说。
假如 I/O 操作挂起,将返回 true。操作完成时,将引发 context 参数的 SocketAsyncEventArgs..::.Completed 事件。
假如 I/O 操作同步完成,将返回 false。将不会引发 context 参数的 SocketAsyncEventArgs..::.Completed 事件,并且可能在方法调用返回后立即检查作为参数传递的 context 对象以检索操作的结果。
有人说一般不会遇到此种问题,但数据量很大的情况下,经常会出现。
每次一出现非异步的时候总会出现无限递归,导致堆栈溢出而退出。改了很长时间,包括加入异步线程池和改成循环来避免递归,但都造成慢慢拒绝连接了。
google上搜了,没见到解决问题的。
http://www.askques.com/2437155/how-does-this-not-cause-a-stack-overflow
解决方案:10分
最简单的方法,加一个ManualResetEvent,
在循环开始的时候 reset,  
在complete或收到连接后Set,
在AcceptAsync之后 WaitOne.
解决方案:20分
socket通信,网上完整例子很多,搜一个参考一下,不要本人靠拍脑袋想,靠这里抄一句那里抄一句的拼凑

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明msdn中示例Socket.AcceptAsync如何避免无限递归
喜欢 (0)
[1034331897@qq.com]
分享 (0)