Пример #1
0
        public static bool SignalAndWait(WaitHandle toSignal, WaitHandle toWaitOn, int millisecondsTimeout, bool exitContext)
        {
            if (toSignal == null)
            {
                throw new ArgumentNullException("toSignal");
            }
            if (toWaitOn == null)
            {
                throw new ArgumentNullException("toWaitOn");
            }
            if (-1 > millisecondsTimeout)
            {
                throw new ArgumentOutOfRangeException("millisecondsTimeout", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
            }
            int num = WaitHandle.SignalAndWaitOne(toSignal.safeWaitHandle, toWaitOn.safeWaitHandle, millisecondsTimeout, toWaitOn.hasThreadAffinity, exitContext);

            if (int.MaxValue != num && toSignal.hasThreadAffinity)
            {
                Thread.EndCriticalRegion();
                Thread.EndThreadAffinity();
            }
            if (128 == num)
            {
                WaitHandle.ThrowAbandonedMutexException();
            }
            if (298 == num)
            {
                throw new InvalidOperationException(Environment.GetResourceString("Threading.WaitHandleTooManyPosts"));
            }
            return(num == 0);
        }
Пример #2
0
        public static int WaitAny(WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext)
        {
            if (waitHandles == null)
            {
                throw new ArgumentNullException(Environment.GetResourceString("ArgumentNull_Waithandles"));
            }
            if (waitHandles.Length == 0)
            {
                throw new ArgumentException(Environment.GetResourceString("Argument_EmptyWaithandleArray"));
            }
            if (64 < waitHandles.Length)
            {
                throw new NotSupportedException(Environment.GetResourceString("NotSupported_MaxWaitHandles"));
            }
            if (-1 > millisecondsTimeout)
            {
                throw new ArgumentOutOfRangeException("millisecondsTimeout", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
            }
            WaitHandle[] waitHandles1 = new WaitHandle[waitHandles.Length];
            for (int index = 0; index < waitHandles.Length; ++index)
            {
                WaitHandle waitHandle = waitHandles[index];
                if (waitHandle == null)
                {
                    throw new ArgumentNullException(Environment.GetResourceString("ArgumentNull_ArrayElement"));
                }
                if (RemotingServices.IsTransparentProxy((object)waitHandle))
                {
                    throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_WaitOnTransparentProxy"));
                }
                waitHandles1[index] = waitHandle;
            }
            int num = WaitHandle.WaitMultiple(waitHandles1, millisecondsTimeout, exitContext, false);

            if (AppDomainPauseManager.IsPaused)
            {
                AppDomainPauseManager.ResumeEvent.WaitOneWithoutFAS();
            }
            if (128 <= num && 128 + waitHandles1.Length > num)
            {
                int location = num - 128;
                if (0 <= location && location < waitHandles1.Length)
                {
                    WaitHandle.ThrowAbandonedMutexException(location, waitHandles1[location]);
                }
                else
                {
                    WaitHandle.ThrowAbandonedMutexException();
                }
            }
            GC.KeepAlive((object)waitHandles1);
            return(num);
        }
Пример #3
0
        internal bool WaitOneWithoutFAS()
        {
            if (this.safeWaitHandle == null)
            {
                throw new ObjectDisposedException((string)null, Environment.GetResourceString("ObjectDisposed_Generic"));
            }
            int num1 = WaitHandle.WaitOneNative((SafeHandle)this.safeWaitHandle, uint.MaxValue, this.hasThreadAffinity, false);
            int num2 = 128;

            if (num1 == num2)
            {
                WaitHandle.ThrowAbandonedMutexException();
            }
            int num3 = 258;

            return(num1 != num3);
        }
Пример #4
0
        internal static bool InternalWaitOne(SafeHandle waitableSafeHandle, long millisecondsTimeout, bool hasThreadAffinity, bool exitContext)
        {
            if (waitableSafeHandle == null)
            {
                throw new ObjectDisposedException((string)null, Environment.GetResourceString("ObjectDisposed_Generic"));
            }
            int num1 = WaitHandle.WaitOneNative(waitableSafeHandle, (uint)millisecondsTimeout, hasThreadAffinity, exitContext);

            if (AppDomainPauseManager.IsPaused)
            {
                AppDomainPauseManager.ResumeEvent.WaitOneWithoutFAS();
            }
            int num2 = 128;

            if (num1 == num2)
            {
                WaitHandle.ThrowAbandonedMutexException();
            }
            int num3 = 258;

            return(num1 != num3);
        }