gpt4 book ai didi

.net - 你如何 'cancel' 一个 UdpClient::BeginReceive?

转载 作者:行者123 更新时间:2023-12-04 13:32:46 24 4
gpt4 key购买 nike

我有一个线程等待来自多个接口(interface)的 UDP 消息,使用 UdpClient::BeginReceive和调用 UdpClient::EndReceive 的回调拾取数据并将其传递。

如果 5 秒后我没有得到任何东西,我会从调用 UdpClient::BeginReceive 的函数返回以便可以取消该过程并发出另一个广播,该广播将触发外部客户端发送 UDP 响应。如果我们不取消,我会调用 UdpClient::BeginReceive再次运行以检查新数据。

如果客户端没有及时收到任何数据,有没有办法在不调用 EndReceive 的情况下取消该异步请求哪个无限期地阻塞?我的印象是让数百个异步触发器运行是个坏主意。

最佳答案

您需要猛拉地板垫,调用 UdpClient.Close() 方法。

这将完成 BeginReceive() 调用,并且您的回调方法将运行。当您调用 EndReceive() 时,该类会告知您地垫已消失,并将引发 ObjectDisposedException。所以准备好处理这个异常,用 try/catch 包装 EndReceive() 调用,这样你就可以捕获 ODE 并退出回调方法。

请注意,这往往会让 .NET 程序员有点不高兴,通常强烈建议不要使用异常进行流控制。但是,您必须调用 EndInvoke(),即使您已经知道这会引发异常。不这样做会导致资源泄漏,可能会持续一段时间。

关于.net - 你如何 'cancel' 一个 UdpClient::BeginReceive?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18309974/

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