second - timer sleep c#
Espere unos segundos sin bloquear la ejecuciĆ³n de la IU (7)
Creo que lo que buscas es Task.Delay. Esto no bloquea el hilo como lo hace Sleep y significa que puede hacer esto usando un solo hilo usando el modelo de programación asíncrono.
async Task PutTaskDelay()
{
await Task.Delay(5000);
}
private async void btnTaskDelay_Click(object sender, EventArgs e)
{
await PutTaskDelay();
MessageBox.Show("I am back");
}
Me gustaría esperar algunos segundos entre dos instrucciones, pero SIN bloquear la ejecución.
Por ejemplo, Thread.Sleep(2000)
no es bueno, porque bloquea la ejecución.
La idea es que llamo a un método y luego espero X segundos (20 por ejemplo) escuchando un evento que viene. Al final de los 20 segundos debería hacer alguna operación dependiendo de lo que sucedió en los 20 segundos.
Este es un buen caso para usar otro hilo:
// Call some method
this.Method();
Task.Factory.StartNew(() =>
{
Thread.Sleep(20000);
// Do things here.
// NOTE: You may need to invoke this to your main thread depending on what you''re doing
});
El código anterior espera .NET 4.0 o superior; de lo contrario, pruebe:
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate
{
Thread.Sleep(20000);
// Do things here
}));
La solución de Omar es decente * si no puede actualizar su entorno a .NET 4.5 para obtener acceso a la API asíncrona y aguardar. Dicho esto, he aquí un cambio importante que debe hacerse para evitar un rendimiento deficiente. Se debe agregar un pequeño retraso entre las llamadas a Application.DoEvents () para evitar el uso excesivo de la CPU. Añadiendo
Thread.Sleep(1);
antes de llamar a Application.DoEvents (), puede agregar dicho retraso (1 milisegundo) y evitar que la aplicación use todos los ciclos de CPU disponibles.
private void WaitNSeconds(int seconds)
{
if (seconds < 1) return;
DateTime _desired = DateTime.Now.AddSeconds(seconds);
while (DateTime.Now < _desired) {
Thread.Sleep(1);
System.Windows.Forms.Application.DoEvents();
}
}
* Consulte blog.codinghorror.com/is-doevents-evil para obtener una discusión más detallada sobre los riesgos potenciales del uso de Application.DoEvents ().
Mira en System.Threading.Timer
clase. Creo que esto es lo que estás buscando.
El ejemplo del código en MSDN parece mostrar que esta clase es muy similar a lo que estás tratando de hacer (verifica el estado después de cierto tiempo).
Realmente no te aconsejo que uses Thread.Sleep(2000)
, por varias razones (algunas se describen here ), pero sobre todo porque no es útil cuando se trata de depurar / probar.
Recomiendo usar un C # Timer en lugar de Thread.Sleep()
. Los temporizadores le permiten realizar métodos con frecuencia (si es necesario) Y son mucho más fáciles de usar en las pruebas. Hay un muy buen ejemplo de cómo usar un temporizador justo detrás del hipervínculo: simplemente ponga su lógica "lo que ocurre después de 2 segundos" en el Timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
método.
Si no quiere bloquear cosas y tampoco quiere usar multi threading, aquí está la solución para usted: https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx
El subproceso UI no está bloqueado y el temporizador espera 2 segundos antes de hacer algo.
Aquí está el código que proviene del enlace de arriba:
// Create a timer with a two second interval.
aTimer = new System.Timers.Timer(2000);
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += OnTimedEvent;
aTimer.Enabled = true;
Console.WriteLine("Press the Enter key to exit the program... ");
Console.ReadLine();
Console.WriteLine("Terminating the application...");
Yo suelo:
private void WaitNSeconds(int segundos)
{
if (segundos < 1) return;
DateTime _desired = DateTime.Now.AddSeconds(segundos);
while (DateTime.Now < _desired) {
System.Windows.Forms.Application.DoEvents();
}
}