問題は、 への呼び出しで、次の呼び出しがすぐにChange
発生するように指定されていることです。毎回呼び出す場合は、ピリオド(-1 の定数) を使用して、次回以降はまったく繰り返さないように指示することができますが、それでも発火し続けます。時間、あなたはそれをリセットします。例えば:Change
Timeout.Infinite
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
です。