ManualResetEventのインスタンスでSetメソッドを呼び出すときに、デッドロックが発生することがあります。私はこれがブロッキング方法であることを示すためにドキュメント内に何かを見つけることができません。何がMREを引き起こす可能性がありますか?EventWaitHandle.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
}
コードはどのように見えるのですか? – MoonKnight
私はSet()を呼び出すメソッドを追加しました。他のスレッドのスタックトレースにパターンが見つかりませんでした。 – chilltemp
ブロックするMRE.Setを聞いたことがなかったので、これは非常に奇妙です。コールの後に 'Console.WriteLine'か他の出力を置いて返していないことを確認しましたか? – Tudor