你怎么'取消'UdpClient :: BeginReceive?

Jon*_*age 6 .net asynchronous c++-cli udpclient

我有一个线程,它等待来自多个接口的UDP消息UdpClient::BeginReceive和一个回调,它调用UdpClient::EndReceive拾取数据并传递它.

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

如果客户端没有及时收到任何数据,是否有办法取消该异步请求而无需EndReceive无限期地调用哪些块?我得到的印象是,运行数百个异步触发器是一个坏主意.

Han*_*ant 13

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

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

请注意,这往往会让.NET程序员感到有些不安,因此通常强烈建议不要使用流控制的异常.但是你必须调用EndInvoke(),即使你已经知道这会抛出异常.如果不这样做,将导致资源泄漏,可能会持续一段时间.