Проблема в том, что ваш звонок на Change
указывает, что следующий вызов должен произойти немедленно .Если вы собираетесь звонить Change
каждый раз, вы можете просто использовать период Timeout.Infinite
(который является просто константой -1), чтобы сказать, что следует избегатьповторяется вообще после следующего раза - но он все равно будет продолжать стрелять, потому что в следующий раз вы его сбросите.Например:
using System;
using System.Threading;
static class Program
{
private static Timer timer = new Timer(TimerCallBack);
public static void Main()
{
timer.Change(TimeSpan.Zero, TimeSpan.FromSeconds(1));
Thread.Sleep(10000);
}
private static void TimerCallBack(object obj)
{
Console.WriteLine("{0}: Fired", DateTime.Now);
timer.Change(TimeSpan.FromSeconds(3),
TimeSpan.FromMilliseconds(Timeout.Infinite));
}
}
Кроме того, вы можете изменить его только один раз, а затем оставить его:
using System;
using System.Threading;
static class Program
{
private static Timer timer = new Timer(TimerCallBack);
private static bool changed = false;
public static void Main()
{
timer.Change(TimeSpan.Zero, TimeSpan.FromSeconds(1));
Thread.Sleep(10000);
}
private static void TimerCallBack(object obj)
{
Console.WriteLine("{0}: Fired", DateTime.Now);
if (!changed)
{
changed = true;
TimeSpan interval = TimeSpan.FromSeconds(3);
timer.Change(interval, interval);
}
}
}
Обратите внимание, что ничто не использует начальный интервал (1 секунда в приведенных выше примерах).) в любом случае, потому что мы вызываем Change
немедленно - если вы действительно хотите другое время перед первым вызовом, не используйте TimeSpan.Zero
при первоначальном вызове Change
.