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

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

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


person SoftMemes    schedule 03.11.2010    source источник


Ответы (2)


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

Но этого было недостаточно. Я запустил свою виртуальную машину и открыл 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, игнорирует возвращаемое значение (почему бы и нет? что вы собираетесь делать, если ядро ​​все равно выйдет из строя?), вы можете спокойно игнорировать его самостоятельно, если хотите очистить свою логику bit или получите его и зарегистрируйте, если вы особенно педантичны.

person Erik Noren    schedule 04.11.2010
comment
Спасибо! Это был интересный вопрос, и мне стало любопытно. - person Erik Noren; 04.11.2010
comment
Спасибо, Эрик. Вдохновленный вашей работой, я сделал то же самое и открыл Reflector. Похоже, что WinIOError() всегда выдает исключение, которое пытается представить код ошибки Win32 в мире .NET, что имеет смысл, но все же не объясняет, почему вызов имеет возвращаемое значение! - person SoftMemes; 04.11.2010
comment
Я могу понять, почему просмотр декомпиляции Reflector был бы полезен, но имейте в виду, что мы, Mono, не Мне не нравится, что мы подвергаемся закрытой реализации, так как это означает, что мы больше не можем вносить свой вклад в эту область Mono. Вероятно, в данном случае это не имеет большого значения, но об этом следует помнить в будущем. - person cdhowie; 07.12.2012
comment
@cdhowie - Есть ли лучший способ справиться с этим? Должен признаться, я не склонен рассматривать последствия моих ответов для кого-то, кто занимается повторной реализацией API или кода в чистой комнате. Это не то, чем я занимаюсь, поэтому я обычно не рассматриваю это. Вопрос не был помечен каким-либо образом, который предполагал бы, что такой ответ будет нежелательным, и я пытался быть тщательным. Как следует подходить к этому? Не показывать код? Использовать ссылку на внешний сайт с сниппетом? Есть ли какой-то стандарт? К каким вопросам он относится? - person Erik Noren; 12.12.2012
comment
Показывать код закрытой реализации на общедоступном веб-сайте, вероятно, никогда не бывает хорошей идеей. В этом случае распространяемое лицензионное соглашение с конечным пользователем .NET Framework не предоставляет (AFAICT) исключение из родительского лицензионного соглашения с конечным пользователем Windows, которое явно запрещает обратное проектирование. Исходя из этой информации, использование Reflector в сборках Framework может быть нарушением лицензионного соглашения. (Если у вас есть информация об обратном, пожалуйста, сообщите мне.) - person cdhowie; 13.12.2012
comment
Ах, я не подумал, что изучение источника для дополнения отсутствующей документации по самому библиотечному вызову может считаться обратным проектированием. Я думаю, что мы в этом разобрались, учитывая цель вопроса и ответа. В будущем я постараюсь быть более вдумчивым, чтобы не раскрывать конкретную реализацию вызова API. - person Erik Noren; 13.12.2012
comment
Исходный код .NET общедоступен. Мы делимся всем этим на referencesource.microsoft.com. Также есть проект git hub с кодом для открытого исходного кода. вклад сообщества Этот конкретный код находится по адресу referencesource.microsoft.com/#mscorlib /system/threading/ строка 273 - person David Burg; 06.02.2021

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

person Kirill Rafalson    schedule 03.04.2012