Nano Hash - криптовалюты, майнинг, программирование

Как безопасно избавиться от System.Timers.Timer?

Когда вы размещаете «сырой» таймер .net, вы можете передать дескриптор ожидания, который будет вызываться после уничтожения таймера Win32, и вы можете предположить, что ваш обратный вызов не будет вызван. (И таймер будет считаться "мертвым" GC)

Как это сделать с помощью System.Timers.Timer?


Ответы:


1

Поскольку System.Timers.Timer и System.Windows.Forms.Timer используют ThreadPool, у него нет дескриптора таймера операционной системы, поэтому нет собственного ресурса таймера, от которого утилизируется — только завершенный поток. Я не уверен, что вы можете захватить поток, перерабатываемый ThreadPool, но я могу ошибаться.

Возможно, вы могли бы свернуть свой собственный (я не проверял это, и использование ManualResetEvent в Dispose может быть более полезным):

void Run()
{
    ManualResetEvent resetEvent = new ManualResetEvent(false);

    System.Threading.Timer timer = new System.Threading.Timer(delegate { Console.WriteLine("Tick"); });
    timer.Dispose(resetEvent);

    MyTimer t = new MyTimer();
    t.Interval = 1000;
    t.Elapsed += delegate { t.Dispose(resetEvent); };

    resetEvent.WaitOne();
}


public class MyTimer : System.Timers.Timer
{
    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);
    }

    public virtual void Dispose(WaitHandle handle)
    {
        handle.SafeWaitHandle.Close();
        Dispose();
    }
}
25.11.2010
  • Я думаю, что событие System.Timers.Timer Disposed срабатывает, как только оно вызывает метод System.Threading.Timer Dispose. 26.11.2010
  • @Ian Событие вызывается внутри Component.Dispose(disposing), поэтому при условии, что вы сигнализируете WaitHandle перед вызовом base.Dispose () и используете пользовательский Dispose (WaitHandle), он должен срабатывать после. 26.11.2010

  • 2

    Установите флаг перед вызовом dispose и проверьте этот флаг в обработчике прошедшего времени. Даже если таймер сработает, этот флаг предотвратит запуск любого связанного с ним кода обработчика. Вы можете формализовать этот шаблон, написав оболочку для таймера.

    Убедитесь, что ваш флаг отмечен как изменчивый, так как к нему будут обращаться из разных потоков.

    25.11.2010
  • @Hans, если флаг volatile установлен перед вызовом dispose, то поток таймера увидит его, если произойдет последующее истекшее событие. В чем проблема, которую вы здесь видите? 25.11.2010
  • Каковы масштабы флага? Особенно в случае оболочки, скажем, с методом Stop, который устанавливает флаг и удаляет таймер. Не является ли наиболее вероятным, что произойдет после вызова Stop, сама обертка выйдет за пределы области действия и будет подвергнута сборке мусора, что сделает флаг недействительным? 28.10.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..