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