Выполняйте операцию каждые x секунд в течение y минут в c # - PullRequest
7 голосов
/ 24 апреля 2009

Мне нужно запускать функцию каждые 5 секунд в течение 10 минут.

Я использую таймер для его запуска в течение 5 секунд, но как мне ограничить таймер только 10 минутами?

Ответы [ 9 ]

13 голосов
/ 25 апреля 2009

Просто запишите время, которое вы хотите остановить и завершить таймер из истекшего обработчика. Вот пример (примечание: я использовал System.Threading.Timer timer. Выберите соответствующий таймер для того, что вы делаете. Например, у вас может быть после System.Windows.Forms.Timer, если вы пишете в Winforms.)

public class MyClass
{
    System.Threading.Timer Timer;
    System.DateTime StopTime;
    public void Run()
    {
        StopTime = System.DateTime.Now.AddMinutes(10);
        Timer = new System.Threading.Timer(TimerCallback, null, 0, 5000);
    }

    private void TimerCallback(object state)
    {
        if(System.DateTime.Now >= StopTime)
        {
            Timer.Dispose();
            return;
        }
        // Do your work...
    }
}
10 голосов
/ 24 апреля 2009

Сделайте так, чтобы ваш цикл таймера был примерно таким:

DateTime endTime = DateTime.Now.AddMinutes(10);

while(endTime < DateTime.Now)
{
  // Process loop
}
6 голосов
/ 24 апреля 2009

Разделите Y минут на интервал X, чтобы узнать, сколько раз ему нужно бежать. После этого вам просто нужно посчитать, сколько раз была вызвана функция.

В вашем случае 10 минут = 600 секунд / 5 секунд = 120 звонков. Просто запишите, сколько раз была вызвана ваша функция.

3 голосов
/ 24 апреля 2009

Вы можете рассчитать, сколько раз будет вызываться ваша функция, и создать счетчик декрементов, по истечении которого вы откажетесь от отметки таймера. Или вы можете запустить другой таймер с тиковым периодом - 10 минут, и на тике вы отмените подписку на тиковый таймер, вызывая вашу функцию.

3 голосов
/ 24 апреля 2009

просто используйте переменную DateTime, чтобы отслеживать, когда она должна закончиться, и установите ее прямо перед началом. На обработчике прошедшего события проверьте, меньше ли время сигнала, чем время окончания. Если это не так, остановите таймер.

3 голосов
/ 24 апреля 2009

Timer.Stop() после 120 тиков.

2 голосов
/ 25 апреля 2009

Вы можете использовать второй таймер:

class Program
{
    static void Main(string[] args)
    {
        int interval = 5 * 1000; //milliseconds
        int duration = 10 * 60 * 1000; //milliseconds

        intervalTimer = new System.Timers.Timer(interval);
        durationTimer = new System.Timers.Timer(duration);

        intervalTimer.Elapsed += new System.Timers.ElapsedEventHandler(intervalTimer_Elapsed);
        durationTimer.Elapsed += new System.Timers.ElapsedEventHandler(durationTimer_Elapsed);

        intervalTimer.Start();
        durationTimer.Start();
    }

    static void durationTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        intervalTimer.Stop();
        durationTimer.Stop();
    }

    static void intervalTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        //call your method
    }

    private static System.Timers.Timer intervalTimer;
    private static System.Timers.Timer durationTimer;
}
2 голосов
/ 24 апреля 2009

Вы можете установить два таймера, которые будут работать 5 секунд, а другой - 10 минут, и отключить первый

.
2 голосов
/ 24 апреля 2009

Обратите внимание на время начала. В каждом вызове проверяйте, находится ли currentTime + 5 секунд> startTime + 10 минут. Если это так, отключите таймер.

Я предпочитаю этот подход просто запускать N тиков, так как таймеры не гарантируют срабатывание, когда вы этого хотите. Возможно, 120 тиков могут работать в течение 10 минут реального времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...