Problemem jest to, że wezwanie do Change
określa, że obok wezwanie powinno się zdarzyć natychmiast. Jeśli zamierzasz zadzwonić pod numer Change
co godzinę, możesz po prostu użyć okresu Timeout.Infinite
(który jest tylko stałą wartości -1), aby powiedzieć, aby w ogóle nie powtórzył się po następnym czasie - ale nadal będzie kontynuował ostrzał , ponieważ następnym razem zresetujesz go. Na przykład:
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));
}
}
Alternatywnie, można ją zmienić tylko raz, a następnie pozostawić go:
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);
}
}
}
Zauważ, że nic nie jest za pomocą początkowego przedziału (1 sekunda w próbkach powyżej), w obu przypadkach , ponieważ natychmiast dzwonimy pod numer Change
- jeśli naprawdę chcesz mieć inny czas przed pierwszym połączeniem, nie używaj TimeSpan.Zero
w pierwszym połączeniu z numerem Change
.
jeśli (prawda) ??? ......... –
@Mitch Wheat, to jest ważne z jakiegoś dobrego powodu, testowanie na przykład? – crypted
Mitch, to tylko przykład. Nie bierz tego do serca. lol – mrbrooks