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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.75 из 5
Похожие ответы