捕获在 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;
}
我在 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;
}