Day*_*mer 42 c# sockets dispose asynchronous
当然,BeginReceive()
如果没有数据,永远不会结束.MSDN 建议调用Close()
将中止BeginReceive()
.
但是,调用Close()
套接字也会执行一个Dispose()
on,就像在这个伟大的ansewr中所计算的那样,因此EndReceive()
会抛出一个异常,因为对象已经被处理掉了(它确实!).
我该怎么办?
Pav*_*sky 51
这似乎是(非常愚蠢的)设计.您必须抛出此异常并将其捕获到您的代码中.
MSDN确实看起来很沉默,但是如果你看一下另一个异步套接字方法的文档,BeginConnect(),我们发现:
要取消对BeginConnect()方法的挂起调用,请关闭Socket.在异步操作正在进行时调用Close()方法时,将调用提供给BeginConnect()方法的回调.对EndConnect(IAsyncResult)方法的后续调用将抛出ObjectDisposedException以指示操作已被取消.
如果这是为BeginConnect做的正确方法,那么BeginReceive也可能如此.这在微软的异步API方面肯定是一个糟糕的设计,因为让用户必须抛出并捕获异常作为正常流程的一部分会使调试器烦恼.在操作完成之前,你真的没有办法"等待",因为Close()就是首先完成的.