private async void BackgroundThreadAsync() { // We check _running just before the event could be raised to avoid events being raised after this class is disposed while (_running) { var waitToNextTimeout = _lastReset + _timeout - DateTime.UtcNow; if (waitToNextTimeout <= TimeSpan.Zero) { TimeoutReached?.Invoke(this, new EventArgs()); _lastReset = DateTime.UtcNow; waitToNextTimeout = _timeout; } // The above makes sure that the delay cannot be negative await Task.Delay(waitToNextTimeout); } }
private void TimeoutReachedHandler(object sender, ElapsedEventArgs e) { Stop(); TimeoutReached?.Invoke(sender, e); }
protected virtual void OnTimeoutReached() { TimeoutReached?.Invoke(this, EventArgs.Empty); }