El problema es que su llamada a Change
especifica que el siguiente llamada debe suceder inmediatamente . Si va a llamar al Change
cada vez, puede simplemente usar un período de Timeout.Infinite
(que es solo una constante de -1) para indicarle que evite repetirlo después de la próxima vez, pero seguirá disparando porque la próxima vez lo restableces Por ejemplo:
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));
}
}
Como alternativa, puede cambiar sólo una vez, y luego dejarlo:
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);
}
}
}
Tenga en cuenta que nada está utilizando el intervalo inicial (1 segundo en los ejemplos anteriores), en ambos casos , porque estamos llamando Change
inmediato - si realmente quieres un tiempo diferente antes de la primera llamada, no utilice TimeSpan.Zero
en la llamada inicial a Change
.
si (true) ??? ......... –
@Mitch Wheat, ¿eso es válido por alguna buena razón, prueba por ejemplo? – crypted
Mitch, es solo un ejemplo. No te lo tomes a pecho. lol – mrbrooks