【发布时间】:2014-04-13 17:42:29
【问题描述】:
根据文档,.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 异常的等待句柄对象。我有没有其他方法可以设置它,以便正确处理句柄并且不会导致异常?
【问题讨论】:
-
为什么主线程在处理等待对象?它的存在是为了向/从线程发出信号 - 线程应该拥有它。
-
这如何解决竞争条件?如果在主线程调用waitOne之前在工作线程中释放了waithandle,waitOne会抛出同样的异常。
-
你能切换到
Task吗?让许多事情变得更容易。
标签: c# multithreading waithandle