Избежать запуска метода по таймеру, если он не завершил работу - C#
Формулировка задачи:
Нужно реализовать такую задачу
Каждую 5 секунд по Sytem.Timers.Timer вызывается метода скажем GO
Так вот, дело в том что процедура "GO" может выполнится от доли секунд до нескольких секунд, даже может минуту иногда.
Т.к. таймер запускает GO каждые пять секунд возникает путаница что непредсказуемо может сказаться в логике работы программы.
Как реализовать чтобы в реале был запущен только 1 поток GO, и так сделать чтобы по завершении GO если поток выполнился более 5 секунд запустить GO еще раз сразу же, если меньше то запустить через оставшуюся время меньше 5 секунд.
Т.е. GO должен запускаться каждые 5 секунд ровно и точно, если время выполнения занимает более 5 секунд то копия GO не запускается а ждет своего времени
т.е. должно запустить например ровно 0,5,10,15,20 и далее только в этих секундах
отсчет 5 секунд не должен идти от завершения процедуры GO
например если GO запустился в 15 секундах и выполняется до 28 секундах, следующий процесс GO должен запуститься сразу же в 30 секундах а не через 5 секунд после 28 в 33 секундах
Решение задачи: «Избежать запуска метода по таймеру, если он не завершил работу»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { Test.Run(5000); Console.ReadLine(); } } static class Test { static bool isRunning; static public void Run(int period) { Timer t = new Timer(ttt, null, 0, period); } static private void ttt(object o) { if (isRunning) return; isRunning = true; Go(); isRunning = false; } static private void Go() { Console.WriteLine(DateTime.Now.ToString()); System.Threading.Thread.Sleep(6000); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д