首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何中止套接字的BeginReceive()?

如何中止套接字的BeginReceive()?
EN

Stack Overflow用户
提问于 2011-01-12 04:55:15
回答 7查看 20K关注 0票数 46

当然,如果没有数据,BeginReceive()永远不会结束。MSDN suggests表示调用Close()将中止BeginReceive()

但是,在套接字上调用Close()还会对其执行Dispose(),如this great answer中所述,因此EndReceive()将抛出异常,因为该对象已经被释放(它确实释放了!)。

我应该如何继续?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-01-12 05:03:37

这似乎是由(非常愚蠢的)设计的。您必须在代码中抛出并捕获此异常。

MSDN看起来确实对此保持沉默,但如果你查看另一个异步套接字方法BeginConnect()的文档,我们会发现:

若要取消对BeginConnect()方法的挂起调用,请关闭套接字。当异步操作正在进行时调用Close()方法时,将调用提供给BeginConnect()方法的回调。随后对EndConnect(IAsyncResult)方法的调用将抛出一个ObjectDisposedException,以指示操作已被取消。

如果这对BeginConnect来说是正确的方式,那么对BeginReceive来说也是如此。对于微软的异步API来说,这肯定是一个糟糕的设计,因为让用户作为正常流程的一部分抛出和捕获异常将会惹恼调试器。您实际上没有办法“等待”到操作完成,因为Close()是首先完成它的。

票数 55
EN

Stack Overflow用户

发布于 2014-12-26 13:53:14

我很惊讶没有人推荐使用SocketOptions。

一旦堆栈有了发送或接收操作,它就被套接字的套接字选项绑定。

使用一个较小的发送或接收超时,并在操作之前使用它,这样您就不会关心它在同一操作期间是否被更改为更短或更长的超时。

这将导致更多的上下文切换,但在任何协议下都不需要关闭套接字。

例如:

1)设置较小的超时

2)执行操作

3)设置更大的超时

这类似于使用Blocking = false,但使用您指定的自动超时。

票数 2
EN

Stack Overflow用户

发布于 2016-12-08 22:43:57

你可以在这里阅读我对这个问题的解决方案(在这里使用Pavel Radzivilovsky的评论):UdpClient.ReceiveAsync correct early termination

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4662553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档