public static int SignalAndWait( WaitableObject waitableObjectToSignal, WaitableObject waitableObjectToWaitOn, int timeoutMilliseconds, bool interruptible = true, bool prioritize = false) { Debug.Assert(waitableObjectToSignal != null); Debug.Assert(waitableObjectToWaitOn != null); Debug.Assert(timeoutMilliseconds >= -1); ThreadWaitInfo waitInfo = Thread.CurrentThread.WaitInfo; bool waitCalled = false; s_lock.Acquire(); try { // A pending interrupt does not signal the specified handle if (interruptible && waitInfo.CheckAndResetPendingInterrupt) { throw new ThreadInterruptedException(); } try { waitableObjectToSignal.Signal(1); } catch (SemaphoreFullException ex) { throw new InvalidOperationException(SR.Threading_WaitHandleTooManyPosts, ex); } waitCalled = true; return(waitableObjectToWaitOn.Wait_Locked(waitInfo, timeoutMilliseconds, interruptible, prioritize)); } finally { // Once the wait function is called, it will release the lock if (waitCalled) { s_lock.VerifyIsNotLocked(); } else { s_lock.Release(); } } }
public static int SignalAndWait( WaitableObject waitableObjectToSignal, WaitableObject waitableObjectToWaitOn, int timeoutMilliseconds, bool interruptible = true, bool prioritize = false) { Debug.Assert(waitableObjectToSignal != null); Debug.Assert(waitableObjectToWaitOn != null); Debug.Assert(timeoutMilliseconds >= -1); ThreadWaitInfo waitInfo = Thread.CurrentThread.WaitInfo; LockHolder lockHolder = new LockHolder(s_lock); try { // A pending interrupt does not signal the specified handle if (interruptible && waitInfo.CheckAndResetPendingInterrupt) { lockHolder.Dispose(); throw new ThreadInterruptedException(); } try { waitableObjectToSignal.Signal(1, ref lockHolder); } catch (SemaphoreFullException ex) { s_lock.VerifyIsNotLocked(); throw new InvalidOperationException(SR.Threading_WaitHandleTooManyPosts, ex); } return(waitableObjectToWaitOn.Wait_Locked(waitInfo, timeoutMilliseconds, interruptible, prioritize, ref lockHolder)); } finally { lockHolder.Dispose(); } }
public static bool SignalAndWait(IntPtr handleToSignal, IntPtr handleToWaitOn, int timeoutMilliseconds) { Debug.Assert(timeoutMilliseconds >= -1); ThreadWaitInfo waitInfo = RuntimeThread.CurrentThread.WaitInfo; // A pending interrupt does not signal the specified handle if (waitInfo.CheckAndResetPendingInterrupt) { throw new ThreadInterruptedException(); } WaitableObject waitableObjectToSignal = HandleManager.FromHandle(handleToSignal); WaitableObject waitableObjectToWaitOn = HandleManager.FromHandle(handleToWaitOn); bool waitCalled = false; s_lock.Acquire(); try { waitableObjectToSignal.Signal(1); waitCalled = true; return(waitableObjectToWaitOn.Wait_Locked(waitInfo, timeoutMilliseconds)); } finally { // Once the wait function is called, it will release the lock if (waitCalled) { s_lock.VerifyIsNotLocked(); } else { s_lock.Release(); } } }