Есть несколько перегрузок AutoResetEvent.WaitOne()
Когда срабатывает сигнал signal.Set(), метод WaitOne() во всех перегрузках возвращает true.
В перегрузке с таймаутом signal.WaitOne(timeout) возвращает false когда таймаут истечет.
А что с перегрузкой без параметров signal.WaitOne()?
Она может возвращать только true и никогда false?
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
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости