Вы сбрасываете значение 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)
}
})
Просто запишите время, в которое вы хотите остановить и завершить таймер, из истекшего обработчика. Вот пример (примечание: я использовал таймер 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...
}
}
Разделите Y минут на интервал X, чтобы узнать, сколько раз ему нужно бежать. После этого вам просто нужно посчитать, сколько раз была вызвана функция.
В вашем случае требуется 10 минут = 600 секунд / 5 секунд = 120 вызовов. Просто запишите, сколько раз была вызвана ваша функция.
просто используйте переменную DateTime, чтобы отследить, когда она должна закончиться, и установите ее прямо перед началом. На обработчике прошедшего события проверьте, меньше ли время сигнала, чем время окончания. Если это не так, остановите таймер.
Вы можете рассчитать, сколько раз будет вызываться ваша функция, и создать счетчик декремента, по истечении которого вы откажетесь от отметки таймера. Или вы можете запустить другой таймер, у которого есть тиковый период - 10 минут, и в этот момент вы отмените подписку на тиковый таймер, вызывая вашу функцию.
Сделайте так, чтобы ваш цикл таймера был примерно таким:
DateTime endTime = DateTime.Now.AddMinutes(10);
while(endTime < DateTime.Now)
{
// Process loop
}
Обратите внимание на время начала. В каждом вызове проверяйте, находится ли currentTime + 5 секунд> startTime + 10 минут. Если это так, отключите таймер.
Я предпочитаю, чтобы этот подход просто выполнялся для N тиков, так как таймеры не гарантированно срабатывают, когда вы этого хотите. Возможно, 120 тиков могут работать в течение 10 минут реального времени.
Вы можете установить два таймера, которые будут работать в течение 5 секунд, и другой, который работает в течение 10 минут и отключает первый
Вы можете использовать второй таймер:
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;
}