2012-10-11 26 views
6

Quiero ejecutar una función periódicamente cada 1 segundo, por lo que después de 10 segundos se ejecuta 10 veces. El enfoque más simple está utilizando un bucle como este:sleep-until in C#

while(true) 
{ 
Thread.Sleep(1000); 
function(); 
} 

Sin embargo, el principal problema con este enfoque es que no se da ninguna garantía periódicas. quiero decir si se tarda 0,1 segundos para la función (ejecución) el tiempo de ejecución de la función será la siguiente: 0, 1.1, 2.2, 3.3, 4.4, ...

Según recuerdo, en el lenguaje en tiempo real ADA tenemos una función sleep-until-hasta (#time). Ahora estoy buscando una alternativa en C#.

Cualquier código de muestra será apreciado.

+2

Duerme en inverals más pequeños y comprueba si ha transcurrido un segundo antes de ejecutar el código. – VVS

+0

¿Qué desea que suceda si función() tarda más de 1 segundo en ejecutarse? –

+0

C# no es un lenguaje en tiempo real. ni siquiera está garantizado que el hilo se ejecutará exactamente después de 1 segundo, ya que podría haber otros hilos/procesos. si necesita ser tan preciso, ¿tal vez debería usar algunas otras herramientas? – YavgenyP

Respuesta

4
System.Threading.Timer timer = new System.Threading.Timer(ThreadFunc, null, 0, 1000); 

private static void ThreadFunc(object state) 
{ 
    //Do work in here. 
} 

Ver MSDN para obtener más información.

+0

Genial, eso es lo que estaba buscando. muchas gracias – user1654052

+0

Me alegra ayudar. Recuerde marcar como la respuesta. –

+0

Lo haré después de 2 minutos (puede aceptar una respuesta después de 2 minutos) – user1654052

1

Para invocar algo después de un intervalo de tiempo específico, debe usar la clase del temporizador. Aquí es el Tutorial

+0

Muchas gracias. eso fue realmente útil :) – user1654052

3

Puede usar Stopwatch para medir la hora. También usaría un For-Loop en su lugar.

var sw = new System.Diagnostics.Stopwatch(); 
var timeForOne = TimeSpan.FromSeconds(1); 
var count = 10; 
for(int i = 0; i < count; i++) 
{ 
    sw.Restart(); 
    function(); 
    sw.Stop(); 
    int rest = (timeForOne - sw.Elapsed).Milliseconds; 
    if (rest > 0) 
     System.Threading.Thread.Sleep(rest); 
} 
+0

¡Genial, pero sigo pensando que el último bloque si, el cálculo del descanso y la llamada a función de sueño consumen alguna vez y no pueden ver ninguna ventaja sobre la anterior! ! Es una alternativa, pero la otra parece más simple :) – user1654052

+0

@ user1654052: En realidad, no cuantificable es 'TimeSpan.Resta '+' if (rest> 0) 'consume, es absolutamente despreciable y menos de 1 milisegundo. –

+0

no es solo eso. eche un vistazo con cuidado. [sw.stop; int rest = blah; if (rest> 0)] todo ejecutado sin tener en cuenta su tiempo y tareas swiches :) Sé que parece insignificante, pero si se va a ejecutar durante un año no se puede garantizar que la función se ejecuta cada segundo. es por eso que no creo que sea una respuesta aceptable – user1654052