WPF DispatcherTimer выдает исключение после возобновления работы систем

Предположим, вы создали DispatchTimer следующим образом:

if (_updateTimer != null) return; 
_updateTimer = new DispatcherTimer(DispatcherPriority.Normal) {Interval = new TimeSpan(0, 0, 0, Settings.Default.UpdateIntervallSec)};
_updateTimer.Tick += UpdateTimerOnTick;
_updateTimer.Start();

Теперь ваша система переходит в спящий режим или приостанавливает работу. После того, как системы возобновят работу, код выдает исключение NullPointerException. Чтобы избежать этого, я регистрируюсь на мероприятии SystemEvents.PowerModeChanged += SystemEventsOnPowerModeChanged;

Со следующим кодом:

private void SystemEventsOnPowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
    if (e.Mode == PowerModes.Suspend)
    {
        if (_updateTimer == null) return;
        _updateTimer.Tick -= UpdateTimerOnTick;
        _updateTimer.IsEnabled = false;
        _updateTimer.Stop();
    }
    if (e.Mode == PowerModes.Resume)
    {
        if (_updateTimer != null) return;
        _updateTimer = new DispatcherTimer(DispatcherPriority.Normal) {Interval = new TimeSpan(0, 0, 0, Settings.Default.UpdateIntervallSec)};
        _updateTimer.Tick += UpdateTimerOnTick;
        _updateTimer.Start();
    }
}

Но это не решает проблему. Исключение вызывается тем, что метод «UpdateTimerOnTick» имеет значение null. Любая хорошая идея, как предотвратить такое поведение?


person sandkasten    schedule 10.09.2013    source источник
comment
Пожалуйста, добавьте полное сообщение и трассировку стека исключения, которое вы получаете   -  person Jehof    schedule 10.09.2013
comment
Нет трассировки стека или другого сообщения. Если отладчик подключен, то все работает нормально. В противном случае отображается только короткое сообщение окна.   -  person sandkasten    schedule 10.09.2013


Ответы (1)


Вы должны установить переменную _updateTimer в null, когда система приостановлена, иначе ваш код в Resume не будет выполнен.

if (_updateTimer == null) return;
// your other code
_updateTimer = null;
person Jehof    schedule 10.09.2013