根据文档,.NET 中的 WaitHandle 应该显式/隐式处理。但是,对于以下基本同步任务,我无法实现这一点:
- 一个耗时的任务正在线程上执行。
- 主线程在预定义的时间段内等待任务完成。如果 a. 主线程必须继续。任务完成或 b. 发生超时。
这里我尝试使用 AutoResetEvent 对象:
using(var waitHandle = new AutoResetEvent(false)){
var worker = new Thread(() =>
{
try
{
TimeConsumingTask();
waitHandle.Set(); //throws System.ObjectDisposedException: Safe handle has been closed
}
catch (Exception e)
{...}
}) {IsBackground = true};
worker.Start(); //start worker
const int waitTimeInMs = 5000;
var signaled = waitHandle.WaitOne(waitTimeInMs);//block main thread here.
if (!signaled)
{ //if timed out
worker.Interrupt();
}
}
有一个明显的竞争条件,主线程等待超时并释放导致 ObjectDisposedException 异常的等待句柄对象。有没有其他方法可以设置它以便正确处理句柄并且不会导致异常?