СитуацияИспользование 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;
}
}
}
Есть ли причина, по которой вы не хотите '.Stop()' таймера и пусть он будет утилизирован в нормальном потоке вещей? –
Конечно, Stop() - это опция. Но на самом деле я хотел больше сосредоточиться на концепции Dispose(). Как вы можете видеть, 'pullTimer' является' private' и поэтому недоступен извне класса. –
При использовании System.Timers.Timer код не всегда корректен, у вас нет никакой гарантии, что событие Elapsed не будет запущено после вызова Dispose(). Или, что он не будет запускаться более одного раза одновременно, свойство AutoReset равно * true * по умолчанию. Или вы заметите исключение в обработчике событий Elapsed, они проглатываются. Не используйте его, если вам нужен надежный код. –