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); }
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; }