У меня есть 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:
Как это возможно? и что мне делать, чтобы остановить выполнение этого события?
Чтобы предотвратить события, которые еще не были запущены:
App.TimeBeforeDeletingSpan.Enabled = false;
Чтобы поместить объект в состояние покоя (что бы это ни значило для объекта)
App.TimeBeforeDeletingSpan.Dispose();
Причина, по которой присваивание null
полю, которое ранее ссылалось на объект, ничего не делает с объектом, заключается в том, что объект может ссылаться на любое другое поле или переменную. Только сборщик мусора может узнать и только когда он работает.
Установка нулевой ссылки на объект не удаляет данный объект, если тип реализует IDisposable, вам нужно будет утилизировать его вручную.
Еще одна вещь, о которой стоит помнить, заключается в том, что таймеры запускаются в отдельном потоке, устанавливая его на нуль, чтобы предотвратить продолжение этого потока, как уже упоминалось ранее, вам необходимо убедиться, что он удален.
TimeBeforeDeletingSpan.Stop()
но этого недостаточно .