public void UpdateStatus(DataSourceState newState, DataSourceStatus.ErrorInfo?newError) { DataSourceStatus?statusToBroadcast = null; lock (_stateLock) { var oldStatus = _currentStatus; if (newState == DataSourceState.Interrupted && oldStatus.State == DataSourceState.Initializing) { newState = DataSourceState.Initializing; // see comment on IDataSourceUpdates.UpdateStatus } if (newState != oldStatus.State || newError.HasValue) { _currentStatus = new DataSourceStatus { State = newState, StateSince = newState == oldStatus.State ? oldStatus.StateSince : DateTime.Now, LastError = newError.HasValue ? newError : oldStatus.LastError }; statusToBroadcast = _currentStatus; _stateChangedSignal.NotifyAll(); } } _outageTracker?.TrackDataSourceState(newState, newError); if (statusToBroadcast.HasValue) { _taskExecutor.ScheduleEvent(this, statusToBroadcast.Value, StatusChanged); } }
public void UpdateStatus(DataSourceState newState, DataSourceStatus.ErrorInfo?newError) { var updated = _status.Update(new StateAndError { State = newState, Error = newError }, out var newStatus); if (updated) { _outageTracker?.TrackDataSourceState(newStatus.State, newError); _taskExecutor.ScheduleEvent(newStatus, StatusChanged); } }