Почему таймер все еще запускает событие Elapsed даже после присвоения ему значения null

1

У меня есть Timer установлен в моем App.cs следующим образом:

public static void SetSnipDeletingTimer(double d)
{
     TimeBeforeDeletingSpan = new Timer(d) {AutoReset = true, Enabled = true};
     TimeBeforeDeletingSpan.Elapsed += TimeBeforeDeletingSpan_Elapsed;
     TimeBeforeDeletingSpan.Start();
}

static void TimeBeforeDeletingSpan_Elapsed(object sender, ElapsedEventArgs e)
{
     foreach (var t in ListOfCapturesUriPaths) File.Delete(t);
}

В другом классе и в определенной логике я назначаю ему null чтобы остановить его, я просто делаю это:

App.TimeBeforeDeletingSpan = null;

Проблема в том, что событие Elapsed все равно срабатывает каждый раз, когда проходит прогон, как показано на этом скриншоте, где точка останова останавливается внутри события, хотя объект имеет значение null:

Изображение 174551

Как это возможно? и что мне делать, чтобы остановить выполнение этого события?

Теги:
wpf

2 ответа

2
Лучший ответ

Чтобы предотвратить события, которые еще не были запущены:

 App.TimeBeforeDeletingSpan.Enabled = false;

Чтобы поместить объект в состояние покоя (что бы это ни значило для объекта)

App.TimeBeforeDeletingSpan.Dispose();

Причина, по которой присваивание null полю, которое ранее ссылалось на объект, ничего не делает с объектом, заключается в том, что объект может ссылаться на любое другое поле или переменную. Только сборщик мусора может узнать и только когда он работает.

0

Установка нулевой ссылки на объект не удаляет данный объект, если тип реализует IDisposable, вам нужно будет утилизировать его вручную.

Еще одна вещь, о которой стоит помнить, заключается в том, что таймеры запускаются в отдельном потоке, устанавливая его на нуль, чтобы предотвратить продолжение этого потока, как уже упоминалось ранее, вам необходимо убедиться, что он удален.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню