Cómo agregar un retraso por 2 o 3 segundos [cerrado]

129

¿Cómo puedo agregar un retraso a un programa en C #?

Mulder
fuente
2
Hay varias formas de hacerlo, pero ¿por qué necesita agregar un retraso? Si lo supiéramos, podríamos sugerir la forma más adecuada de hacerlo.
ChrisF
3
Esta pregunta está irremediablemente sub documentada para recomendar Thread.Sleep ().
Hans Passant
1
Solo para aclarar, voté para cerrar esta pregunta porque no ha proporcionado suficientes detalles para que nadie pueda dar una respuesta buena y de calidad. Estoy perfectamente dispuesto a volver a abrirlo como una pregunta válida si agrega más detalles sobre exactamente lo que está tratando de hacer. Votar para cerrar temprano es una forma de evitar una avalancha de respuestas de "ruido" a preguntas de baja calidad. Una vez que haya agregado más detalles, déjeme un comentario y / o marque un mod para volver a abrirlo.
Cody Gray
14
Mala decisión de cerrar esta pregunta. Es una pregunta, y está bien que sea de naturaleza genérica. Lo entendí perfectamente.
user2430797
55
Otra pregunta que estaba buscando, respondida por una pregunta que se cerró sin ninguna razón.
Glenn Maynard

Respuestas:

177

Podrías usar la Thread.Sleep()función, por ejemplo

int milliseconds = 2000;
Thread.Sleep(milliseconds);

que detiene completamente la ejecución del hilo actual durante 2 segundos.

Probablemente el escenario más apropiado Thread.Sleepes cuando desea retrasar las operaciones en otro hilo, diferente del principal, por ejemplo:

 MAIN THREAD        --------------------------------------------------------->
 (UI, CONSOLE ETC.)      |                                      |
                         |                                      |
 OTHER THREAD            ----- ADD A DELAY (Thread.Sleep) ------>

Para otros escenarios (por ejemplo, iniciar operaciones después de un tiempo, etc.) verifique la respuesta de Cody .

digEmAll
fuente
13
Evite usar Thead.Sleep, porque bloqueará completamente el hilo actual de hacer NADA hasta que la duración termine.
Mohammed Swillam
77
@Mohammed: sí, por supuesto, bloqueará completamente la banda de rodadura. Pero a veces puede ser útil ... realmente depende de lo que el OP necesita ...
digEmAll
12
Como no puedo publicar una nueva respuesta, me gustaría comentar: si no desea que bloquee el programa, puede usarlo await Task.Delay(milliseconds). Esto funcionó para mí :)
SaiyanGirl
En mi caso, no pude usar esperar porque me llamaron de una parte del programa escrita por otra persona. No está a la espera, pero si me "cuelgo" puedo trabajar durante 10 segundos antes de que se apaguen mis cosas. Dormir 2 segundos funciona a las mil maravillas;) Entonces, en algunos casos, este es el camino.
Ecth
@MohammedElSayed: La respuesta es depende. Todo depende de la intención del uso. En cuanto a mi caso, necesito dormir el hilo durante 0.6 segundos con precisión para evitar una restricción de índice al insertar en la base de datos.
GunWanderer
61

Use un temporizador con un intervalo establecido de 2 a 3 segundos.

Tiene tres opciones diferentes para elegir, según el tipo de aplicación que esté escribiendo:

  1. System.Timers.Timer
  2. System.Windows.Forms.Timer
  3. System.Threading.Timer

No lo use Thread.Sleepsi su aplicación necesita procesar cualquier entrada en ese hilo al mismo tiempo (WinForms, WPF), ya Sleepque bloqueará completamente el hilo y evitará que procese otros mensajes. Suponiendo una aplicación de un solo subproceso (como la mayoría), toda su aplicación dejará de responder, en lugar de solo retrasar una operación como probablemente haya pensado. Tenga en cuenta que puede estar bien usar Sleep en la aplicación de consola pura ya que no hay "eventos" para manejar o en un hilo separado (también Task.Delayes una mejor opción).

Además de los temporizadores Sleep, puede usar una Task.Delayversión asincrónica Sleepque no bloquee el hilo de los eventos de procesamiento (si se usa correctamente, no lo convierta en suspensión infinita con .Wait()).

 public async void ClickHandler(...)
 {
      // whatever you need to do before delay goes here         

      await Task.Delay(2000);

      // whatever you need to do after delay.
 }

Lo mismo await Task.Delay(2000)puede usarse en un Mainmétodo de una aplicación de consola si usa C # 7.1 ( Async main en los blogs de MSDN ).

Nota: retrasar la operación Sleeptiene el beneficio de evitar las condiciones de carrera que surgen de iniciar potencialmente múltiples operaciones con temporizadores Delay. Desafortunadamente, la aplicación congelada basada en la interfaz de usuario no es aceptable, por lo que debe pensar en lo que sucederá si inicia varios retrasos (es decir, si se activa al hacer clic en un botón). La operación se puede realizar varias veces de forma segura.

Cody Gray
fuente
55
Si se trata de una aplicación de consola, la Thread.Sleepadvertencia puede no ser tan importante.
Merlyn Morgan-Graham
1
Hay un 4º temporizador: System.Web.UI.Timer , un componente ASP.NET que realiza devoluciones de datos asíncronas o síncronas de páginas web a intervalos regulares.
David
1
Debería ser la mejor respuesta. Si esto tuviera un ejemplo para usar uno de los temporizadores, obtendría más votos ...
Mercutio
Cody Gray, ¿puede agregar una await Task.Delay()versión y un comentario en línea que la aplicación de consola realmente quiera usar Sleep(no asincrónica Main) o Delay(asincrónica Main)
Alexei Levenkov
1
@CodyGray hecho.
Alexei Levenkov
39

Durante 2,3 segundos debes hacer:

System.Threading.Thread.Sleep(2300);
Mitja Bonca
fuente
6
System.Threading.Thread.Sleep(
    (int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);

O con usingdeclaraciones:

Thread.Sleep((int)TimeSpan.FromSeconds(2).TotalMilliseconds);

Prefiero esto a 1000 * numSeconds(o simplemente 3000) porque hace más obvio lo que le está sucediendo a alguien que no ha usado Thread.Sleepantes. Mejor documenta tu intención.

Merlyn Morgan-Graham
fuente
2
+1 para TimeSpan más de 1000 *
Zurdo
Con .NET 4 en adelante, puede usarlo Thread.Sleep(TimeSpan)directamente, sin tener que enviarlo a un int.
Holf