Deseo que mi método espere unos 500 ms y luego verifique si alguna bandera ha cambiado. ¿Cómo completar esto sin bloquear el resto de mi aplicación?C# espere un tiempo sin bloquear
Respuesta
Thread.Sleep (500) obligará al hilo actual a esperar 500ms. Funciona, pero no es lo que quieres si toda tu aplicación se ejecuta en un hilo.
En ese caso, tendrá que utilizar un temporizador, así:
using System.Timers;
void Main()
{
Timer t = new Timer();
t.Interval = 500; //In milliseconds here
t.AutoReset = true; //Stops it from repeating
t.Elapsed += new ElapsedEventHandler(TimerElapsed);
t.Start();
}
void TimerElapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Hello, world!");
}
También puede establecer AutoReset a falso (o no está establecido en absoluto) si desea que el temporizador a repetirse .
Sólo una ligera corrección, el 'Interval'property tiene un valor en milisegundos ** **, no segundos [link] (http://msdn.microsoft.com/en-us/library/system.timers.timer.interval (v = vs.110) .aspx) –
hilo actual ** ** era muy útil i. erróneamente pensé que 'Thread.Sleep' causa que el hilo principal duerma. –
Creo que tiene el uso de AutoReset al revés. Al establecerlo como verdadero o sin establecerlo, el temporizador se repite. [link] (https: // msdn.microsoft.com/en-us/library/s ystem.timers.timer.autoreset% 28v = vs.110% 29.aspx? f = 255 y MSPPError = -2147217396) – JochemKempe
Es el método en cuestión se ejecuta en un hilo diferente que el resto de la aplicación, a continuación, haga lo siguiente:
Thread.Sleep(500);
¿Qué tal si todo funciona en un thraed? – santBart
@ user898569 por definición, si desea "esperar algo", algo tiene que sentarse allí "esperando". Entonces no, debes usar otro hilo o bloqueará tu programa. Consulte [Respuesta de Tudor] (http://stackoverflow.com/a/8496300/80274) para ver una forma de activar un evento que se ejecutará en el hilo principal pero que no estará "esperando", sino que será un evento periódico. –
Interesante pregunta. Te sugiero que leas sobre programación asincrónica en .NET. Aquí hay un enlace a un buen punto de partida: http://msdn.microsoft.com/es-es/VStudio/gg316360 –
System.Threading.Thread.Sleep(500);
actualización
Esto no va a bloquear la resto de su aplicación, solo el hilo que está ejecutando su método.
Realmente no entiendo la pregunta.
Si desea bloquear antes de comprobar, utilizar Thread.Sleep(500);
Si desea comprobar de forma asíncrona cada x segundos, se puede utilizar un Timer
para ejecutar un controlador cada x milisegundos.
Esto no bloqueará el hilo actual.
Creo que esto es lo que necesita la OP. – Otiel
Si se trata de una aplicación de interfaz gráfica de usuario, entonces es probablemente la mejor manera de utilizar el temporizador específico para la biblioteca de interfaz gráfica de usuario utilizado (por ejemplo 'DispatcherTimer' en el caso de WPF). – svick
hay una diferencia entre "comprobar cada x segundos" y "esperando x segundos y luego marcar". creo que el PO quiere este último. –
El uso de un temporizador debe hacer el truco
si es necesario utilizar un hilo entonces aquí es un ejemplo
void Main()
{
System.Threading.Thread check= new System.Threading.Thread(CheckMethod);
check.Start();
}
private void CheckMethod()
{
//Code
Thread.Sleep(500);
}
Asynchron Tarea:
var task = new Task (() => function_test()); task.Start();
public void function_test() { `Wait for 5000 miliseconds` Task.Delay(5000);` }
Puede utilizar await Task.Delay(500);
sin bloquear el hilo como Sleep
lo hace, y con mucho menos código que un temporizador.
- 1. crear un índice sin bloquear el DB
- 2. Espere un solo mensaje RabbitMQ con un tiempo de espera
- 3. RabbitMQ Espere un mensaje con un tiempo de espera
- 4. ¿Quieres consultar un semáforo PHP sin bloquear?
- 5. Función Inno Setup Exec() Espere por un tiempo limitado
- 6. C# threading - Bloquear Objeto
- 7. Bloquear un archivo y eliminarlo sin soltar primero el candado
- 8. finalmente bloquear en C#
- 9. Bloquear instrucción C#
- 10. ¿cuánto se puede bloquear c?
- 11. C++ Dejar que un hilo de refuerzo espere 1 segundo
- 12. Pause la ejecución de un método sin bloquear la GUI. C#
- 13. Espere a que termine un subproceso desconectado en C++
- 14. Bloquear archivos en Linux con c/C++
- 15. trazado de líneas sin bloquear la ejecución
- 16. Espera sincrónica sin bloquear el UI-Thread
- 17. ¿Espera sin bloquear el hilo? - ¿Cómo?
- 18. bloquear datos compartidos usando C#
- 19. ¿Cómo detectar la salida anticipada de pthread_create sin bloquear durante demasiado tiempo?
- 20. ¿Hay una operación "intentar bloquear, saltar si se agotó el tiempo de espera" en C#?
- 21. Lazy Loading UIImages de archivos sin bloquear el hilo principal?
- 22. Cómo bloquear hasta que se active un evento en C#
- 23. Bloquear() en un método estático
- 24. SVN bloquear un directorio
- 25. Bloquear en un objeto
- 26. Bloquear pila y cola libres en C#
- 27. Cómo bloquear un solo esqueleto
- 28. Configurando tuberías leyendo desde tuberías nombradas sin bloquear en bash
- 29. ¿Cómo puedo bloquear la pantalla usando C#?
- 30. ¿Cómo puedo probar STDIN sin bloquear en Perl?
La pregunta está muy poco especificada; necesitamos saber qué es "el resto de la aplicación": ¿se ejecuta en el mismo hilo, diferentes hilos, una máquina diferente, qué? Dicho esto, casi todas las respuestas hasta ahora son peligrosas. Usar DoEvents o Thread.Sleep son las peores prácticas que indican una aplicación mal diseñada en peligro de errores de reentrada desagradables. La respuesta de Tudor es la mejor: usa un temporizador. –
Además, considere investigar la versión Async CTP de C# 5. Hemos agregado flujo de control que le permite demorar fácilmente durante 500 milisegundos y continuar donde lo dejó, sin bloquear ningún hilo o iniciar nuevos bucles de mensajes. –