2011-12-13 16 views
12

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

+6

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. –

+4

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. –

Respuesta

25

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 .

+2

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) –

+0

hilo actual ** ** era muy útil i. erróneamente pensé que 'Thread.Sleep' causa que el hilo principal duerma. –

+0

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

5

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); 
+1

¿Qué tal si todo funciona en un thraed? – santBart

+0

@ 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. –

+0

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 –

2
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.

+0

¿alguna alternativa? – santBart

+0

Lol, la mía tomó más de 7 segundos para escribir porque puse en el espacio de nombres. No estaba primero :( – danludwig

7

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.

+1

Creo que esto es lo que necesita la OP. – Otiel

+0

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

+0

hay una diferencia entre "comprobar cada x segundos" y "esperando x segundos y luego marcar". creo que el PO quiere este último. –

0

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); 
} 
0

Asynchron Tarea:

var task = new Task (() => function_test()); task.Start(); 

public void function_test() { `Wait for 5000 miliseconds` Task.Delay(5000);` } 
2

Puede utilizar await Task.Delay(500); sin bloquear el hilo como Sleep lo hace, y con mucho menos código que un temporizador.

Cuestiones relacionadas