当一些WaitHandle正在调用WaitOne时,如何关闭应用程序?

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,我不确定这是否被认为是犹太洁食,或者是否应该在应用程序退出之前处理该对象.

这是一个糟糕的设计吗?如果没有,通常如何处理这种情况?

Bri*_*eon 8

定义一个额外的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)