在C#中,您可以通过3种方式尝试在上接收TCP数据Socket
:
Socket.Receive
是一种同步阻塞方法。除非成功,否则它不会返回,除非失败或超时(可选)。Socket.BeginReceive
如果是异步的,则使用现已过时的Begin / End模式在有数据要接收时调用提供的回调/委托Socket.ReceiveAsync
开始异步请求以接收数据但是我的理解是这些都不能让您取消接收操作吗?文档建议EndReceive
用于完成读取,不是有人可以调用来终止请求吗?
您经常会看到类似的代码 while(socket.Available==0 && !cancel)Sleep(50); if(!cancel)socket.Receive(...);
但是,那太可怕了。
如果我想坐在等待数据的位置,但有时取消接收,说用户点击“停止”按钮,如何做到这一点,这样以后在意外情况下不会触发回调?
我曾经想过关闭套接字,这会导致接收操作失败,但是看起来有些难看。我是在沿着正确的方向思考,还是上面列出的各种API方法都允许直接取消,这样我就不会冒着悬挂异步操作的风险了吗?
没有取消它的已知方法(AFAIK)
您可以做的一件事就是设置Socket.Blocking = false
。没有数据时,接收将立即返回。这样它就不会挂起。
您应该检查Socket.Blocking属性。
我建议您使用BeginReceive(IList<ArraySegment<Byte>>, SocketFlags, SocketError, AsyncCallback, Object)
重载来防止它引发异常。
检查“ Would Block”上的SocketError,表示“没有数据”。因此,您可以重试。
没有测试过->
一个好主意是使用非异步版本Receive来接收0个字节(使用静态byte [] emptyBuffer = new byte [0]),如果sockerError返回“ would block”,则可能会有短暂的延迟,并且重试。当它不返回socketError时,可能有数据。因此,您可以启动一个异步版本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句