Когда ManualResetEvent.Set() может вернуть false?

Согласно документации MSDN, Set() и Reset() для ManualResetEvent (или любого EventWaitHandle) возвращают логический индикатор того, была ли операция успешной.

При каких обстоятельствах этот вызов может вернуть false, и что я должен делать, если это произойдет?

2 ответа

Решение

Я не знал, как на это ответить, и, глядя на множество примеров MSDN, значение Set return игнорируется, поэтому оно не должно быть важным или вероятным.

Но этого было недостаточно. Я запустил свою виртуальную машину и открыл Reflector, чтобы взглянуть на код. ManualResetEvent не имеет Set, но он наследует от EventWaitHandle, который имеет. Вот код:

public bool Set()
{
    bool flag = Win32Native.SetEvent(base.safeWaitHandle);
    if (!flag)
    {
        __Error.WinIOError();
    }
    return flag;
}

Где SetEvent импортируется из Kernel32:

[DllImport("kernel32.dll", SetLastError=true)]
internal static extern bool SetEvent(SafeWaitHandle handle);

Вызов WinIOError() просто вызывает GetLastWin32Error, который нас не особо волнует. По сути, это означает, что вызов возвращает false, что-то довольно неправильное должно было произойти в собственном коде Win32.

Объединяя эту информацию с тем фактом, что код, размещенный в официальной документации MSDN, игнорирует возвращаемое значение (почему нет? Что вы будете делать, если ядро ​​все равно выйдет из строя?), Вы можете спокойно игнорировать его самостоятельно, если хотите очистить свою логику. немного или получить и записать это, если вы особенно педантичны.

Я не уверен, что будет достаточно ошибки журнала и продолжения выполнения. Ложный результат от Set() может привести к неправильному поведению в синхронизации потоков, управляемой обработчиками ожидания. Это многопоточность... Мое видение обработки ложного результата Set() - выбросить исключение, которое, вероятно, в большинстве случаев может быть необработанным.

Другие вопросы по тегам