当某些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/