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