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 .
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:
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()).
publicasyncvoidClickHandler(...){// whatever you need to do before delay goes here awaitTask.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.
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)
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.
Respuestas:
Podrías usar la
Thread.Sleep()
función, por ejemploque detiene completamente la ejecución del hilo actual durante 2 segundos.
Probablemente el escenario más apropiado
Thread.Sleep
es cuando desea retrasar las operaciones en otro hilo, diferente del principal, por ejemplo:Para otros escenarios (por ejemplo, iniciar operaciones después de un tiempo, etc.) verifique la respuesta de Cody .
fuente
await Task.Delay(milliseconds)
. Esto funcionó para mí :)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:
System.Timers.Timer
System.Windows.Forms.Timer
System.Threading.Timer
No lo use
Thread.Sleep
si su aplicación necesita procesar cualquier entrada en ese hilo al mismo tiempo (WinForms, WPF), yaSleep
que 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énTask.Delay
es una mejor opción).Además de los temporizadores
Sleep
, puede usar unaTask.Delay
versión asincrónicaSleep
que no bloquee el hilo de los eventos de procesamiento (si se usa correctamente, no lo convierta en suspensión infinita con.Wait()
).Lo mismo
await Task.Delay(2000)
puede usarse en unMain
método de una aplicación de consola si usa C # 7.1 ( Async main en los blogs de MSDN ).Nota: retrasar la operación
Sleep
tiene el beneficio de evitar las condiciones de carrera que surgen de iniciar potencialmente múltiples operaciones con temporizadoresDelay
. 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.fuente
Thread.Sleep
advertencia puede no ser tan importante.await Task.Delay()
versión y un comentario en línea que la aplicación de consola realmente quiera usarSleep
(no asincrónicaMain
) oDelay
(asincrónicaMain
)Durante 2,3 segundos debes hacer:
fuente
O con
using
declaraciones:Prefiero esto a
1000 * numSeconds
(o simplemente3000
) porque hace más obvio lo que le está sucediendo a alguien que no ha usadoThread.Sleep
antes. Mejor documenta tu intención.fuente
Thread.Sleep(TimeSpan)
directamente, sin tener que enviarlo a un int.