Когда AutoResetEvent.WaitOne() без параметров возвращает false?

212
08 июля 2019, 19:20

Есть несколько перегрузок AutoResetEvent.WaitOne()
Когда срабатывает сигнал signal.Set(), метод WaitOne() во всех перегрузках возвращает true.
В перегрузке с таймаутом signal.WaitOne(timeout) возвращает false когда таймаут истечет.

А что с перегрузкой без параметров signal.WaitOne()?
Она может возвращать только true и никогда false?

Answer 1

WaitOne() вызывает другую перегрузку:

https://referencesource.microsoft.com/#mscorlib/system/threading/waithandle.cs,212

public virtual bool WaitOne ()
{
    //Infinite Timeout
    return  WaitOne(-1,false);
}

Дальше идет вызов статического метода InternalWaitOne:

https://referencesource.microsoft.com/#mscorlib/system/threading/waithandle.cs,235

[System.Security.SecurityCritical]  // auto-generated
internal static bool InternalWaitOne(SafeHandle waitableSafeHandle, long millisecondsTimeout, bool hasThreadAffinity, bool exitContext)
{
    if (waitableSafeHandle == null)
    {
        throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_Generic"));
    }
    Contract.EndContractBlock();
    int ret = WaitOneNative(waitableSafeHandle, (uint)millisecondsTimeout, hasThreadAffinity, exitContext);
    if(AppDomainPauseManager.IsPaused)
        AppDomainPauseManager.ResumeEvent.WaitOneWithoutFAS();
    if (ret == WAIT_ABANDONED)
    {
        ThrowAbandonedMutexException();
    }
    return (ret != WaitTimeout);
}

WaitOneNative потом вызывает функцию WinAPI WaitForSingleObjectEx. Так что WaitOne без параметров или возвратит true, или кинет AbandonedMutexException. Так как WaitForSingleObjectEx не может вернуть статус WAIT_TIMEOUT, если указан бесконечный таймаут.

https://docs.microsoft.com/en-us/windows/desktop/api/synchapi/nf-synchapi-waitforsingleobjectex

READ ALSO
C#: Приведение рациональной дроби к строке

C#: Приведение рациональной дроби к строке

Пишу класс для бесконечных чисел с плавающей точкойОднако, конвертация в строку происходит неправильно

172
Touch узнать когда палец сменил направление

Touch узнать когда палец сменил направление

Как узнать если палец двигался и сменил направление то есть двигался в перед а потом начал назад

160
Как правильно спрятать ORM?

Как правильно спрятать ORM?

Допустим есть БД и взаимодействие с ней выполняется через какое-то ORM

181
Получить данные выбранной строки DataGrid в MVVM

Получить данные выбранной строки DataGrid в MVVM

Как получить данные выбранной строки DataGrid в MVVM? Если я правильно понимаю, данные выбранной строки DataGrid попадают в SelectedProduct, а оттуда раздаются...

201