2012-02-02 27 views
6

Tengo un código que, cuando se ejecuta, ejecuta series de líneas en secuencia. Me gustaría agregar una pausa en el medio.Alternativa al hilo. ¿Dormir en C#?

Actualmente, lo tengo como esto

//do work 
Thread.Sleep(10800000); 
//do work 

Sin embargo, esto se congela el software, y yo creo que es porque el tiempo de sueño es demasiado tiempo. Busqué en línea y encontré otro trabajo llamado Timer. ¿Puede alguien mostrarme un código de muestra para Timer que funciona igual que Thread.sleep?

Gracias de antemano.

Editar: Necesito que el software espere 3 horas antes de continuar con el resto de la ejecución del código. Este software está destinado a comunicarse con las máquinas, y no puedo permitir que el resto del código se ejecute mientras espera durante 3 horas.

+2

... Así que utilizar un tiempo de sueño más corto? 10 800 000 milisegundos es de tres horas. Los temporizadores y dormir sirven para diferentes propósitos, realmente no se puede reemplazar uno por otro. – millimoose

+2

Er, ¿por qué pediste un tiempo de inactividad de 10800 segundos? – Qwertie

+2

Solo para aclarar, ¿realmente quieres dormir durante '10800000' milisegundos (3 horas)? – keyboardP

Respuesta

4

Su software se congelaría si esa suspensión está en el hilo principal. Tenga en cuenta que el parámetro está en milisegundos. 10 800 000 milisegundos = 10 800 segundos

Otra forma de pasar el tiempo es pasar un objeto TimeSpan en su lugar. Ej:

// Sleep for 10 seconds 
System.Threading.Thread.Sleep(new TimeSpan(0, 0, 10)); 

En cuanto a temporizador:

Usted puede utilizar System.Timers.Timer;

Timer timer = new Timer(); 
timer.Interval = 20; // milliseconds 
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
timer.AutoReset = true; // if not set you will need to call start after every event fired in the elapsed callback 
timer.Start(); 
6

Consulte this MSDN reference on the System.Threading.Timer class. Hay una gran explicación, todos los miembros de la clase y algunos ejemplos de código para que sigas cuando pruebes/aprendas.

Sin embargo, tenga en cuenta que el Timer se debe utilizar cuando desee iniciar un evento en un intervalo determinado. Si solo está buscando detener la ejecución de su aplicación, entonces debe ir con Thread.Sleep(). Sin embargo, como muchos otros han señalado, está causando que su hilo duerma durante un período de tiempo prolongado.

2

El Thread.Sleep es lo que desea utilizar para esto, aunque es posible que desee utilizar un período de sueño más razonable que 3 horas.

Actualización:

Después de leer algunos de los comentarios, Thread.Sleep probablemente no es lo que quiere. Use un System.Threading.Timer en su lugar, como otros han sugerido.

+0

Si el requisito ** es ** esperar 3 horas antes de ejecutar algún código, entonces usar 'Thread.Sleep' no es lo que debería usar. – ken2k

+0

De acuerdo, lo he actualizado. –

+0

Podría ser un problema constante. Tampoco dice que está en un formulario, podría ser un servicio o un símbolo del sistema. Si bien no parece que lo estaba haciendo correctamente, hay muchas razones para que las cosas sucedan una vez cada x horas (copia de seguridad de DB, funciones de limpieza, etc.). – JeremyK

0

Está durmiendo el hilo durante 10800 segundos, o 3 horas. Thread.Sleep() está diseñado para congelar el hilo y evitar que todo funcione en el software durante ese tiempo. En este caso, la duración es de 18 minutos. ¿Que estás tratando de hacer?

2

Su problema es que está bloqueando el hilo principal de su solicitud, que es responsable de mantener la interfaz de usuario en funcionamiento. No deberías hacer esto. En su lugar, use un temporizador: el formulario es probablemente el más fácil en una aplicación Forms, o considere BackgroundWorker.(Para una espera tan larga, un temporizador es probablemente más adecuado)

1

Thread.Sleep normalmente se utilizará para poner en pausa una secuencia separada, no en el hilo principal de la aplicación.

El temporizador normalmente se usaría para ocasionar periódicamente que el hilo principal detenga sus operaciones normales y maneje un evento.

Se puede utilizar cualquiera de los dos métodos para realizar periódicamente una función después de un cierto intervalo de tiempo.

Lo que no haría es pedirle al hilo principal que duerma durante 3 horas.

4

USE A TIMER!

private DispatcherTimer Timer; 
public Constructor 
{ 
    Timer = new System.Windows.Threading.DispatcherTimer(); 
    Timer.Tick += new EventHandler(Timer_Tick); 
    Timer.Interval = new TimeSpan(0,0,10); 
    Timer.Start(); 
} 


private void Timer_Tick(object sender, EventArgs e) 
{ 
    Timer.Stop(); 
    Timer -= Timer_Tick; 
    Timer = null; 
    // DO SOMETHING 
} 
1

Creo que deberías usar un Monitor. Le ayuda a esperar a los objetos y liberar el bloqueo cuando necesita continuar ejecutando el programa.

Usted debe encontrar su respuesta aquí: Safe Thread Synchronization

1

Puede reemplazar

Thread.Sleep(X); 

por

Task.WaitAll(Task.Delay(X));