捕获在UDPClient.EndReceive处抛出的ObjectDisposedException

时间:2015-07-22 06:19:45

标签: c# .net udpclient objectdisposedexception

我在Windows服务中使用异步回调来接收网络上的UDP数据广播。

回调使用UDPClient.EndReceive()方法结束挂起的异步接收。在服务OnStop()方法期间UDPClient.Close() UDP客户端。在此之后,我经常在异步回调中下一次调用ObjectDisposedException时获得EndReceive(),该异步回调正在另一个线程上访问。

显然,在使用try { UDPClient.EndReceive(...); }的接收回调中捕获此异常对我来说没有问题,但是我希望有一些信心在关闭服务时抛出捕获的ODE(正如预期的那样)而不是其他一些原因。我可以创建一个设置的布尔标志,并指示服务何时停止,并在catch块中检查,但我觉得我忽略了一个更优雅的解决方案。

如何确保我捕获的ODE是预期的ODE,而不是真正意外的异常?

1 个答案:

答案 0 :(得分:1)

我最终使用bool标志来表示服务正在停止。 serviceStopping标志在服务的OnStop()方法中设置为true,并在捕获ObjectDisposedException时进行检查:

try 
{
    datagram = client.EndReceive(arClient, ref remoteEP); 
}
catch (ObjectDisposedException)
{
    //if the service is stopping this is expected
    if(serviceStopping)
    {
        //return without further processing
        //in the receiveCallback
        return;
    }

    //otherwise rethrow the exception
    throw;
}