c# SocketAsyncEventArgs下使用ConnectAsync问题

.Net技术 码拜 7年前 (2017-05-06) 2757次浏览
最近在研究c#网络通信SocketAsyncEventArgs的使用,有一个问题不清楚,代码如下:
SocketAsyncEventArgs connectArgs = new SocketAsyncEventArgs();
connectArgs.UserToken = clientSocket;
connectArgs.RemoteEndPoint = hostEndPoint;
connectArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnConnect);
clientSocket.ConnectAsync(connectArgs);
autoConnectEvent.WaitOne(); //阻塞. 让程序在这里等待,直到连接响应后再返回连接结果
问题如下:  clientSocket.ConnectAsync在msdn上说完成可能是同步也可能是异步,但是这边却没有处理同步完成的情况,本人不知道能否线程等待能否是会导致这个一定是异步完成IO操作,请各位大牛赐教一下。
解决方案

20

ConnectAsync采用相似事件的方式通知其状态,从而让用户根据状态来处理后续操作。
所以:autoConnectEvent.WaitOne();这个代码貌似没用,来了连接就告你了,等什么?而且会阻塞线程。

20

引用:

            clientSocket.ConnectAsync(connectArgs);
autoConnectEvent.WaitOne(); //阻塞. 让程序在这里等待,直到连接响应后再返回连接结果
问题如下:  clientSocket.ConnectAsync在msdn上说完成可能是同步也可能是异步,但是这边却没有处理同步完成的情况,本人不知道能否线程等待能否是会导致这个一定是异步完成IO操作,请各位大牛赐教一下。

它所谓的“同步、异步”是指内部ConnectAsync结束机制,而非这里的编程形式。它是指在这条语句返回时就已经连接成功了(本来可以直接用这个方法的返回值继续处理连接)、还是没有连接成功(需要在事件参数中获取并随后继续处理连接)。
例如已经连接好,并不需要向对方发送消息,这个方法就会同步执行完毕。
其实这一层,msdn 作者完全没有“必要”太技术化“,完全没有必要混沌地提这个,说这个反而产生了纠结。本来就是告诉你应该异步编程形式来设计程序就可以了,完全不用管这个方法能否在内部同步完成了。
不论是这个方法内部是同步或异步完成了 Connect,实际上都会触发 Completed 事件。所以异步形式的代码,不管是内部是ConnectAsync 代码内部是同步还是异步执行的,都无所谓。
但是这里的代码虽然用了一个异步形式的代码,实际上做了一个模拟同步程序才干的低级的设计,也就是“阻塞”。这其实是第二层把水搅浑的做法,而且 msdn 这里直接鲜明地用了最差的代码来写例子。真正异步的设计流程,应该不写 WaitOne,而是真正在 OnConnect 中执行随后的工作。而这里的代码看上去,它这里写了一个 WaitOne,那么很可能在 OnConnect 中只不过是一个 Set 代码,其实就是阻塞,用一个 OnConnect 回调来反过来让你的阻塞信号量能”通过“去执行随后的代码,这是把代码弄复杂了。原本在回调中执行随后的代码就行了。
它这样写 WaitOne 阻塞代码,是假设读者无法理解在 OnConnect 中继续处理后续流程的设计概念。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c# SocketAsyncEventArgs下使用ConnectAsync问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)