我在Windows服务中使用异步回调来接收网络上的UDP数据广播。
回调使用UDPClient.EndReceive()
方法结束挂起的异步接收。在服务OnStop()
方法期间UDPClient.Close()
UDP客户端。在此之后,我经常在异步回调中下一次调用ObjectDisposedException
时获得EndReceive()
,该异步回调正在另一个线程上访问。
显然,在使用try { UDPClient.EndReceive(...); }
的接收回调中捕获此异常对我来说没有问题,但是我希望有一些信心在关闭服务时抛出捕获的ODE(正如预期的那样)而不是其他一些原因。我可以创建一个设置的布尔标志,并指示服务何时停止,并在catch
块中检查,但我觉得我忽略了一个更优雅的解决方案。
如何确保我捕获的ODE是预期的ODE,而不是真正意外的异常?
答案 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;
}