【发布时间】:2012-03-27 03:48:56
【问题描述】:
我在 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
}
【问题讨论】:
-
代码是什么样子的??
-
我添加了调用 Set() 的方法。我还没有在其他线程的堆栈跟踪中找到模式。
-
这很奇怪,因为我从未听说/经历过
MRE.Set阻止。您是否尝试在调用后放置Console.WriteLine或其他一些输出以确保它不会返回? -
没有。我将添加额外的日志记录 (NLog)。这只会发生在我们满负荷的服务器上,所以我今天不会有额外的日志。但是,我能够通过将 VS2010 连接到一个有问题的进程(从昨晚深夜挂起)来验证堆栈跟踪。
-
这是一个控制台应用程序,由 Windows 服务启动/控制。没有用户交互。它接收表示要做的工作的 Tibco EMS 消息,通过 COM dll 调用单线程计算引擎,然后通过 Tibco EMS 将结果发送出去。
标签: c# multithreading .net-3.5 deadlock manualresetevent