Beispiel #1
0
        public bool Wait(Int32 milliseconds, CancellationToken token)
        {
            VerboseLog("{0:000}|{1}|sync wait requested", Thread.CurrentThread.Id, _id);
            CheckDisposed();
            token.ThrowIfCancellationRequested();

            if (milliseconds == -1 && token == CancellationToken.None)
            {
                _sem.AcquireUninterruptibly();
                CheckDisposed();
                VerboseLog("{0:000}|{1}|sync wait complete.", Thread.CurrentThread.Id, _id);
                return(true);
            }
            if (token == CancellationToken.None)
            {
                var ret = _sem.TryAcquire(milliseconds, TimeUnit.MILLISECONDS);
                CheckDisposed();
                VerboseLog("{0:000}|{1}|sync wait complete: {2}", Thread.CurrentThread.Id, _id, ret);
                return(ret);
            }

            var thread = Thread.CurrentThread;

            try
            {
                using (token.Register(thread.Interrupt))
                {
                    var ret = _sem.TryAcquire(milliseconds, TimeUnit.MILLISECONDS);
                    CheckDisposed();
                    VerboseLog("{0:000}|{1}|sync wait complete: {2}", Thread.CurrentThread.Id, _id, ret);
                    return(ret);
                }
            }
            catch (Java.Lang.InterruptedException ex)
            {
                VerboseLog("{0:000}|{1}|sync wait cancelled", Thread.CurrentThread.Id, _id);
                throw new OperationCanceledException("operation cancelled", ex, token);
            }
        }