public Task StopAsync() { if (0 != this._isDisposed) { return(TplTaskExtensions.CompletedTask); } this._refreshTimer.Cancel(); bool lockTaken = false; object obj; CancellationTokenSource cancellationTokenSource; SignalTask signalTask; try { Monitor.Enter(obj = this._segmentLock, ref lockTaken); this._isRunning = false; cancellationTokenSource = this._abortTokenSource; signalTask = this._readTask; } finally { if (lockTaken) { Monitor.Exit(obj); } } CancellationTokenExtensions.CancelSafe(cancellationTokenSource); return(signalTask.WaitAsync()); }