Что может вызвать EventWaitHandle.Set (), чтобы заблокировать текущий поток? - PullRequest
1 голос
/ 09 марта 2012

Я вызываю метод Set для экземпляра ManualResetEvent, и он иногда блокируется.Я не могу найти ничего в документации, чтобы указать, что это метод блокировки.Что может вызвать блокировку 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 Ответ

1 голос
/ 12 апреля 2012

Мы нашли источник этой проблемы с помощью наших друзей из службы поддержки разработчиков Microsoft.

EventWaitHandle.Set () входит в раздел критических блоков и может быть заблокирован, если собственный код входит в критический блок и не освобождает его. Это происходит с очень старой сторонней библиотекой, которую мы используем, и ее нелегко заменить / обновить.

...