Exemplo n.º 1
0
        private async Task <IDisposable> WaitAndLockPip()
        {
            int newValue = Interlocked.Increment(ref _pipLockWaitCount);

            await _pipLock.WaitAsync(_pipCancel.Token);

            IDisposable result = null;

            try {
                if (newValue == 1)
                {
                    var evt = UpdateStarted;
                    if (evt != null)
                    {
                        evt(this, EventArgs.Empty);
                    }
                }
                result = new CallOnDispose(() => {
                    try {
                        if (Interlocked.Decrement(ref _pipLockWaitCount) == 0)
                        {
                            var evt = UpdateComplete;
                            if (evt != null)
                            {
                                evt(this, EventArgs.Empty);
                            }
                        }
                    } finally {
                        _pipLock.Release();
                    }
                });
            } finally {
                if (result == null)
                {
                    _pipLock.Release();
                }
            }
            return(result);
        }
Exemplo n.º 2
0
        private async Task<IDisposable> WaitAndLockPip() {
            int newValue = Interlocked.Increment(ref _pipLockWaitCount);

            await _pipLock.WaitAsync(_pipCancel.Token);

            IDisposable result = null;
            try {
                if (newValue == 1) {
                    var evt = UpdateStarted;
                    if (evt != null) {
                        evt(this, EventArgs.Empty);
                    }
                }
                result = new CallOnDispose(() => {
                    try {
                        if (Interlocked.Decrement(ref _pipLockWaitCount) == 0) {
                            var evt = UpdateComplete;
                            if (evt != null) {
                                evt(this, EventArgs.Empty);
                            }
                        }
                    } finally {
                        _pipLock.Release();
                    }
                });
            } finally {
                if (result == null) {
                    _pipLock.Release();
                }
            }
            return result;
        }