Dan*_*Tao 8 c# multithreading idisposable shutdown waithandle
是否有一种标准方法可以"干净地"关闭应用程序,而某些WaitHandle
对象可能处于当前阻塞调用的状态WaitOne
?
例如,可能有一个后台线程在这样的方法中旋转:
while (_request.WaitOne())
{
try
{
_workItem.Invoke();
}
finally
{
OnWorkCompleted();
}
}
Run Code Online (Sandbox Code Playgroud)
我没有看到没有明显的方法来处理这个线程而没有调用Thread.Abort
(根据我的理解,这是不鼓励的).调用Close
了对_request
对象(AutoResetEvent
),但是,会抛出异常.
目前,运行此循环的线程已将其IsBackground
属性设置为true
,因此应用程序似乎正常关闭.但是,自从WaitHandle
实现以来IDisposable
,我不确定这是否被认为是犹太洁食,或者是否应该在应用程序退出之前处理该对象.
这是一个糟糕的设计吗?如果没有,通常如何处理这种情况?
定义一个额外的WaitHandle
被调用_terminate
,它将发出一个请求来终止循环,然后使用WaitHandle.WaitAny
而不是WaitHandle.WaitOne
.
var handles = { _request, _terminate };
while (WaitHandle.WaitAny(handles) == 0)
{
try
{
_workItem.Invoke();
}
finally
{
OnCompleteWork();
}
}
Run Code Online (Sandbox Code Playgroud)