2016-04-20 5 views
-1

СитуацияИспользование Dispose, чтобы остановить таймер от вызова

Я использую класс, содержащий объект Timer для вызова метода каждые Х секунд. Этот класс (как часть концепции MVVM) тесно связан с UserControl.XAML.

Когда пользователь «закрывает», объект класса UserControl «MyClass» (включая таймер) больше не нужен.

Я предполагаю, что объект таймера будет непрерывно выполнять метод WriteLine("Called after 15 secs") блок Мусорный коллектор завершает объект «MyClass».

Чтобы избежать этого, я могу вручную реализовать метод Dispose для уничтожения объекта таймера. (См. Пример)

Правильно ли это?

(Также вопрос, если его требуется установить pullTimer = null)

Спасибо передовой!

Пример

class MyClass : IDisposable { 
    private System.Timers.Timer pullTimer; 

    public MyClass(){ 
     pullTimer = new System.Timers.Timer(15000); 
     pullTimer.Elapsed += (s, o) => { System.Diagnostics.Debug.WriteLine("Called after 15 secs"); }; 
     pullTimer.Start(); 
    } 

    public void Dispose() { 
     // Disposing action 
     if(pullTimer != null) { 
      pullTimer.Dispose(); 
      // below required? 
      pullTimer = null; 
     } 
    } 
} 
+0

Есть ли причина, по которой вы не хотите '.Stop()' таймера и пусть он будет утилизирован в нормальном потоке вещей? –

+0

Конечно, Stop() - это опция. Но на самом деле я хотел больше сосредоточиться на концепции Dispose(). Как вы можете видеть, 'pullTimer' является' private' и поэтому недоступен извне класса. –

+0

При использовании System.Timers.Timer код не всегда корректен, у вас нет никакой гарантии, что событие Elapsed не будет запущено после вызова Dispose(). Или, что он не будет запускаться более одного раза одновременно, свойство AutoReset равно * true * по умолчанию. Или вы заметите исключение в обработчике событий Elapsed, они проглатываются. Не используйте его, если вам нужен надежный код. –

ответ

0

Вы должны вызвать метод Stop() вашего таймера, чтобы сохранить его от стрельбы.

0

Согласен с ответом, данным Эндрю Мортоном и Александром. Кроме того, вы также можете отключить время в то время, когда вы не хотите, чтобы он работал. TimerObject.Enable = false;

 Смежные вопросы

  • Нет связанных вопросов^_^