当某些WaitHandle对象可能处于对WaitOne的当前阻塞调用状态时,是否存在一种“干净”关闭应用程序的标准方法?

例如,可能有一个后台线程以这种方法旋转:

while (_request.WaitOne())
{
    try
    {
        _workItem.Invoke();
    }
    finally
    {
        OnWorkCompleted();
    }
}

我看不出没有调用Thread.Abort的明显方法(不鼓励使用Close)。但是,在_request对象(AutoResetEvent)上调用IsBackground将引发异常。

当前,运行此循环的线程的true属性设置为WaitHandle,因此应用程序似乎正常关闭。但是,由于IDisposable实现了ojit_code,因此我不确定这是否被视为洁净对象,或者该对象是否真的应该在应用程序退出之前被处理掉。

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

最佳答案

定义一个名为WaitHandle的附加_terminate,该信号将发出终止循环的信号,然后使用WaitHandle.WaitAny代替WaitHandle.WaitOne

var handles = { _request, _terminate };
while (WaitHandle.WaitAny(handles) == 0)
{
  try
  {
    _workItem.Invoke();
  }
  finally
  {
    OnCompleteWork();
  }
}

关于c# - 在对WaitOne的调用过程中出现某些WaitHandle时,如何关闭应用程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3087683/

10-12 17:05