Когда 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() - выбросить исключение, которое, вероятно, в большинстве случаев может быть необработанным.