/// <summary> /// Looks for changes in underlying repository and updates all SettingsBase (registered with this SettingsManager) objects with changed values /// Respects all error handling settings; /// </summary> public void UpdateChangedSettings() { try { lock (SyncRoot) { if (ReaderExecuting != null) { ReaderExecuting.Invoke(this, new EventArgs()); } var now = Now(); var settingsFromRepo = Repository.ReadSettings(GetCategoriesToRead(), _lastRead).ToNonNullArray(); if (settingsFromRepo.Length == 0) { return; } foreach (SettingsBase settings in AllSettings.Values) { var category = settings.Category; var matchingSettings = settingsFromRepo.Where(s => s.Category == category); SetProperties(settings, matchingSettings, ThrowPropertySetExceptionsOnPeriodicRead); } foreach (var f in settingsFromRepo.Where(s => s.Category == FlagsCategoryName)) { if (SetFlag(f.Name, f.Value)) { if (FlagChanged != null) { FlagChanged.Invoke(this, new PropertyChangedEventArgs(f.Name)); } } } _lastRead = settingsFromRepo.Max(s => s.UpdatedAt); //sets last read time to newest found setting if (_lastRead > now) //last read time must not be greated than current time { _lastRead = now; } } } catch (Exception ex) { _periodicReaderErrors.FlushOld(Now()); if (PeriodicReaderError != null) { var args = new RepeatingErrorEventArgs() { Exception = ex, IsRepeating = _periodicReaderErrors.Contains(ex.GetType().Name) }; PeriodicReaderError.Invoke(this, args); } _periodicReaderErrors.Add(ex.GetType().Name); } }