Избежать запуска метода по таймеру, если он не завершил работу - 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);
}
}
}