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


129

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


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 .


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.


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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.