Когда ManualResetEvent.Set () вернуть false?
-
28-09-2019 - |
Вопрос
Согласно документации MSDN, установите () и reset () на ManualResetEvent (или любой eventWaithandle) возвращает булевую индикатор, независимо от того, была ли операция успешной.
При каких обстоятельствах это позвонить вернуть ложь, а что я должен делать, если это делает?
Решение
Я не был уверен, как ответить на это и смотреть на множество примеров MSDN, установленное возвращаемое значение игнорируется, поэтому он не должен быть важен или может произойти.
Но это было недостаточно хорошим. Я выпустил свой виртуальную машину, и я открыл отражатель, чтобы взглянуть на код. ManualResetEvent не установлен, но он наследует от 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);
Вызов WinioioError () только что звонит getlastwin32Error, на котором мы не заботимся о. В основном это означает для вызова, чтобы вернуть ложное, что-то довольно не так, должно было произойти в родном коде Win32.
Смесив эту информацию вместе с тем, что код, размещенный в официальной документации MSDN, игнорирует возвращаемое значение (почему нет? Что вы собираетесь делать, если я больше не удается?) Вы можете смело игнорировать его, если вы хотите очистить свою логику Бит или получите его и войдите, если вы особенно педантично.
Другие советы
Я не уверен, что просто ошибка журнала и продолжение выполнения будет зависеть. FALSE REVEST от SET () может принести неправильное поведение в потоках синхронозации, управляемые по желанию обработчиков. Это многопоточность ... Мое видение обращения с ложным набором () результатом - бросить исключение, которое, вероятно, в большинстве случаев может быть необработанным.