tengo dos alternativas mediante temporizador o el uso de sueño, tengo que llamar a un método cada 3 segundos después de que se terminó este método, escribí ejemplo básico para demostrar lo que quiero decir:¿Qué debo usar el sueño o el temporizador de
public static void Main()
{
new Thread(new ThreadStart(fooUsingSleep)).Start();
callToMethodAfterInterval(new Action<object, ElapsedEventArgs>(fooUsingTimer), 3000);
}
public static void fooUsingSleep()
{
Console.WriteLine("Doing some consuming time work using sleep");
Thread.Sleep(3000);
fooUsingSleep();
}
public static void fooUsingTimer(object dummy, ElapsedEventArgs dummyElapsed)
{
Console.WriteLine("Doing some consuming time work usning timer");
callToMethodAfterInterval(new Action<object, ElapsedEventArgs>(fooUsingTimer), 3000);
}
public static void callToMethodAfterInterval(Action<object,ElapsedEventArgs> inMethod, int inInterval)
{
System.Timers.Timer myTimer = new System.Timers.Timer();
myTimer.Elapsed += new ElapsedEventHandler(inMethod);
myTimer.Interval = inInterval;
myTimer.AutoReset = false;
myTimer.Start();
}
Entonces mis preguntas son
1) ¿Puedo escribir el código con el temporizador más elegante? Significa eliminar la llamada al método callToMethodAfterInterval de fooUsingTimer, hacer que el temporizador sea de una o dos líneas, y eliminar las variables ficticias de la declaración de fooUsingTimer?
2) Entiendo que el sueño no está ocupado esperando (http://www.codeproject.com/KB/threads/ThreadingDotNet.aspx) Así que no encontré la justificación para usar la opción de temporizador aquí, porque el el sueño es más simple, ¿qué es mejor usar, la versión del temporizador o la del sueño?
3) Sé que Timers.timer es seguro para subprocesos, ¿me puede ayudar en el comportamiento que deseo implementar?
Gracias.
Me gustaría señalar que no creo que esto sea exactamente lo que se suponía que estaba haciendo el original, era hacer una tarea larga y luego volver a ejecutarla 3 segundos después de que se completara. ¿La suya se ejecutará cada segundo? – Paddy
@Paddy, correcto, estaba asumiendo una tarea relativamente corta. El OP debería decir. –
No quiero que se llame a la opción foo antes de que las otras llamadas a foo hayan terminado ... – Delashmate