Il problema è che la chiamata a Change
specifica che il prossimo chiamata dovrebbe accadere immediatamente. Se hai intenzione di chiamare Change
ogni ora, puoi semplicemente usare un periodo di Timeout.Infinite
(che è solo una costante di -1) per dirgli di evitare di ripetere il tutto dopo la prossima volta - ma continuerà comunque a sparare , perché la prossima volta lo resetti. Ad esempio:
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));
}
}
In alternativa, si potrebbe cambiare solo una volta, e poi lasciarlo:
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);
}
}
}
Nota che nulla sta utilizzando l'intervallo iniziale (1 secondo nei campioni sopra) in entrambi i casi , perché stiamo chiamando immediatamente Change
- se vuoi davvero un orario diverso prima della prima chiamata, non utilizzare TimeSpan.Zero
nella chiamata iniziale a Change
.
fonte
2011-05-25 05:31:59
se (vero) ??? ......... –
@Mitch Wheat, che è valido per qualche buona ragione, testare ad esempio? – crypted
Mitch, è solo un esempio. Non portarlo al cuore. lol – mrbrooks