gpt4 book ai didi

c# - 如何中止套接字的 BeginReceive()?

转载 作者:IT王子 更新时间:2023-10-29 03:57:41 24 4
gpt4 key购买 nike

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

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

我应该如何进行?

最佳答案

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

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

To cancel a pending call to the BeginConnect() method, close the Socket. When the Close() method is called while an asynchronous operation is in progress, the callback provided to the BeginConnect() method is called. A subsequent call to the EndConnect(IAsyncResult) method will throw an ObjectDisposedException to indicate that the operation has been cancelled.

如果这是对 BeginConnect 的正确处理方式,那么对于 BeginReceive 可能也是如此。对于 Microsoft 的异步 API 而言,这无疑是一个糟糕的设计,因为让用户必须将异常作为正常流程的一部分抛出并捕获异常会惹恼调试器。在操作完成之前,您真的没有办法“等待”,因为 Close() 是首先完成它的。

关于c# - 如何中止套接字的 BeginReceive()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4662553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com