捕获在 UDPClient.EndReceive 抛出的 ObjectDisposedException

Catching an ObjectDisposedException thrown at UDPClient.EndReceive

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

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

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

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

我最终使用 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;
}