Выполните операцию каждый x секунды в течение y минут в c#

Вы сбрасываете значение i обратно на ноль каждый раз, когда срабатывает обратный вызов вашего сообщения. Вместо этого вы можете объявить i как глобальную переменную, а затем увеличить ее в своем операторе if следующим образом:

var i = 0; // declare outside (to avoid resetting it)
client.on('message', msg => {
  if (msg.content === 'ping') {
      msg.reply('Pong!')
  }

  if (msg.content === '+1') {
      msg.reply("Counter: " +i)
      i++; // increment the value of i (same as i = i + 1)
  }
})
8
задан Lauren Van Sloun 5 December 2018 в 23:28
поделиться

9 ответов

Просто запишите время, в которое вы хотите остановить и завершить таймер, из истекшего обработчика. Вот пример (примечание: я использовал таймер System.Threading.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...
    }
}
14
ответ дан 5 December 2019 в 04:39
поделиться

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

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

6
ответ дан 5 December 2019 в 04:39
поделиться

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

3
ответ дан 5 December 2019 в 04:39
поделиться

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

3
ответ дан 5 December 2019 в 04:39
поделиться

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

3
ответ дан 5 December 2019 в 04:39
поделиться

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

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

while(endTime < DateTime.Now)
{
  // Process loop
}
10
ответ дан 5 December 2019 в 04:39
поделиться

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

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

2
ответ дан 5 December 2019 в 04:39
поделиться

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

2
ответ дан 5 December 2019 в 04:39
поделиться

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

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
ответ дан 5 December 2019 в 04:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: