什么可能导致EventWaitHandle.Set()阻止当前线程?

时间:2012-03-09 17:25:39

标签: c# multithreading .net-3.5 deadlock manualresetevent

我在ManualResetEvent的一个实例上调用Set方法,它偶尔会死锁。我在文档中找不到任何表明这是阻塞方法的内容。什么可能导致MRE.Set阻止?

堆栈追踪:

[Managed to Native Transition]
mscorlib.dll!System.Threading.EventWaitHandle.Set() + 0xe bytes
MyCode.StopAll(bool force) Line 179 + 0xd bytes
MyCode.CalcCheckThread() Line 250 + 0xb bytes
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) + 0x66 bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x6f bytes
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 bytes



private static void StopAll(bool force)
{
    if( !force )
        LogHelper.SendAllCloseState(logger);

    _forcablyExit = force;
    _running = false;
    _stopWait.Set();  // This line appears to be blocking
}

1 个答案:

答案 0 :(得分:1)

我们已经在Microsoft Developer Support的朋友们的帮助下找到了这个问题的根源。

EventWaitHandle.Set()进入关键块部分,如果本机代码进入关键块并且从不释放它,则可以阻止它。这种情况发生在我们正在使用的非常古老的第三方库中,无法轻易替换/更新。