none
Исключение накопления событий таймера RRS feed

  • Вопрос

  • Добрый день.

    Для выполнения некоторых периодических действий использую System.Timers.Timer, при этом иногда операция затягивается, что приводит к увеличению активных потоков и, можно сказать, параллельному выполнению, изначально предназначенных для последовательного выполнения, действий. Для исключения распараллеливания в обработчике таймера перед выполнением полезных действий используется отключение таймера, а после выполнения - включение. Насколько хорош данный подход? Может быть правильнее реализовать свой поток с циклом и нужным временем ожидания, чем дёргать таймер?

    Спасибо

Ответы

  • Можно завести приватное поле _isTimerRunning, которое проверять в начале работы таймера. Если = true, просто завершать метод, если false, выставлять в true и продолжать выполнение метода. По завершении (лучше через блок try-finally) выставлять опять значение в false.
    • Изменено Anton.MaksimovEditor 17 мая 2012 г. 13:41
    • Помечено в качестве ответа tulosba 18 мая 2012 г. 13:49
    Отвечающий
  • Для вашей задачи также можно использовать таймер из пространства имен Threading - Timer - конструктор (TimerCallback, Object, Int64, Int64), у которого параметр period задавать 0, а  dueTime времени через которое должен сработать таймер. Так таймер будет вызван всего лишь один раз через заданный промежуток времени, после выполнения необходимы методов вы снова можете завести таймер, методом Change на 1 раз через заданное время. Таким образом действия не будут перекрывать друг друга и идти последовательно через определенные промежутки времени после завершения предыдущей итерации.

    Для связи [mail]

    • Помечено в качестве ответа tulosba 6 июня 2012 г. 10:28

Все ответы

  • Сложно сказать, что лучше. Но если у вас с отключением-включением все работает, то и оставьте так. Особых потерь в производительности из-за 1-го таймера в системе вы не увидите. Он ведь ни что иное, как высокоуровневая абстракция над отдельным тридом с циклом внутри.
    Отвечающий
  • Можно завести приватное поле _isTimerRunning, которое проверять в начале работы таймера. Если = true, просто завершать метод, если false, выставлять в true и продолжать выполнение метода. По завершении (лучше через блок try-finally) выставлять опять значение в false.
    • Изменено Anton.MaksimovEditor 17 мая 2012 г. 13:41
    • Помечено в качестве ответа tulosba 18 мая 2012 г. 13:49
    Отвечающий
  • Так же для общего развития почитайте эту статью. Будет полезна и для этого случая и для будущих, связанных с потоками.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий
  • Для вашей задачи также можно использовать таймер из пространства имен Threading - Timer - конструктор (TimerCallback, Object, Int64, Int64), у которого параметр period задавать 0, а  dueTime времени через которое должен сработать таймер. Так таймер будет вызван всего лишь один раз через заданный промежуток времени, после выполнения необходимы методов вы снова можете завести таймер, методом Change на 1 раз через заданное время. Таким образом действия не будут перекрывать друг друга и идти последовательно через определенные промежутки времени после завершения предыдущей итерации.

    Для связи [mail]

    • Помечено в качестве ответа tulosba 6 июня 2012 г. 10:28