コード例 #1
0
 new public void Reset()
 {
     if (_eventThread != null)
     {
         _eventThread.SafeAbort();
     }
     _eventThread = ThreadUtils.StartBackgroundThread(WaitingForTimeout);
 }
コード例 #2
0
ファイル: WaitHandleUtils.cs プロジェクト: xoposhiy/KOIB
        public static int WaitOneOrTwoOrAllOthers(WaitHandle one, WaitHandle two, WaitHandle[] others)
        {
            CodeContract.Requires(one != null);
            CodeContract.Requires(two != null);
            CodeContract.Requires(others != null && others.Length > 1);
            var occurredEventIndex = WaitHandle.WaitTimeout;
            var eventSignaled      = new ManualResetEvent(false);
            var waitOneThread      = ThreadUtils.StartBackgroundThread(
                () =>
            {
                try
                {
                    one.WaitOne();
                    occurredEventIndex = 0;
                }
                finally
                {
                    eventSignaled.Set();
                }
            });
            var waitTwoThread = ThreadUtils.StartBackgroundThread(
                () =>
            {
                try
                {
                    two.WaitOne();
                    occurredEventIndex = 1;
                }
                finally
                {
                    eventSignaled.Set();
                }
            });
            var waitOthersThread = ThreadUtils.StartBackgroundThread(
                () =>
            {
                try
                {
                    WaitHandle.WaitAll(others);
                    occurredEventIndex = 2;
                }
                finally
                {
                    eventSignaled.Set();
                }
            });

            eventSignaled.WaitOne();
            waitOneThread.SafeAbort();
            waitTwoThread.SafeAbort();
            waitOthersThread.SafeAbort();
            return(occurredEventIndex);
        }