Come aggiungere un ritardo di 2 o 3 secondi [chiuso]


129

Come posso aggiungere un ritardo a un programma in C #?


2
Esistono diversi modi per farlo, ma perché è necessario aggiungere un ritardo? Se lo sapessimo, saremmo in grado di suggerire il modo più appropriato per farlo.
ChrisF

3
Questa domanda è irrimediabilmente sotto documentata per raccomandare mai Thread.Sleep ().
Hans Passant,

1
Solo per chiarimenti, ho votato per chiudere questa domanda perché non hai fornito dettagli sufficienti a nessuno per dare una risposta buona e di qualità. Sono perfettamente disposto a riaprirlo come una domanda valida se aggiungi qualche dettaglio in più su esattamente cosa stai cercando di fare. Votare per chiudere presto è un modo per prevenire un flusso di "rumore" che risponde a domande di scarsa qualità. Dopo aver aggiunto ulteriori dettagli, lasciami un commento e / o contrassegna una mod per riaprirla.
Cody Grey

14
Cattiva decisione di chiudere questa domanda. È una domanda ed è giusto che sia di natura generica. L'ho capito perfettamente.
user2430797

5
Ancora un'altra domanda che stavo cercando, ha risposto con una domanda che è stata chiusa senza motivo.
Glenn Maynard,

Risposte:


177

È possibile utilizzare la Thread.Sleep()funzione, ad es

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

che interrompe completamente l'esecuzione del thread corrente per 2 secondi.

Probabilmente lo scenario più appropriato per Thread.Sleepquando si desidera ritardare le operazioni in un altro thread, diverso dal principale, ad esempio:

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

Per altri scenari (ad esempio l'avvio delle operazioni dopo un po 'di tempo, ecc.), Controllare la risposta di Cody .


13
Evita di usare Thead. Sleep causa Bloccherà completamente il thread corrente dal fare QUALCOSA fino alla fine della durata.
Mohammed Swillam,

7
@Mohammed: sì, certo bloccherà completamente il battistrada. Ma a volte può essere utile ... dipende davvero da ciò di cui ha bisogno il PO ...
digEmAll

12
Poiché non riesco a pubblicare una nuova risposta, vorrei commentare: se non vuoi che blocchi il programma, puoi usarlo await Task.Delay(milliseconds). Questo ha funzionato per me :)
SaiyanGirl

Nel mio caso non ho potuto usare wait perché sono stato chiamato da una parte del programma scritta da qualcun altro. Non è attendibile, ma se "blocco" posso lavorare per 10 secondi prima che le mie cose vengano chiuse. Dormire 2 secondi funziona come un fascino;) Quindi in alcuni casi questo è il modo.
ect

@MohammedElSayed: la risposta dipende. Tutto dipende dall'intenzione dell'uso. Per quanto riguarda il mio caso, ho bisogno di sospendere il thread per 0,6 secondi proprio per evitare un vincolo di indice durante l'inserimento nel database.
GunWanderer,

61

Utilizzare un timer con un intervallo impostato su 2-3 secondi.

Hai tre diverse opzioni tra cui scegliere, a seconda del tipo di applicazione che stai scrivendo:

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

Non utilizzare Thread.Sleepse l'applicazione deve elaborare contemporaneamente qualsiasi input su quel thread (WinForms, WPF), poiché Sleepbloccherà completamente il thread e gli impedirà di elaborare altri messaggi. Supponendo un'applicazione a thread singolo (come la maggior parte lo è), l'intera applicazione smetterà di rispondere, piuttosto che ritardare un'operazione come probabilmente intendi. Si noti che può essere utile utilizzare Sleep nell'applicazione console pura in quanto non vi sono "eventi" da gestire o su thread separati ( Task.Delayè anche l' opzione migliore).

Oltre ai timer e Sleeppuoi usare Task.Delayla versione asincrona Sleepche non blocca il thread dagli eventi di elaborazione (se usato correttamente, non trasformarlo in modalità di sospensione 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 stesso await Task.Delay(2000)può essere utilizzato in un Mainmetodo di un'applicazione console se si utilizza C # 7.1 ( Async main sui blog MSDN ).

Nota: ritardare l'operazione con Sleepha il vantaggio di evitare condizioni di gara che derivano dall'avvio potenzialmente di più operazioni con timer / Delay. Sfortunatamente il congelamento dell'applicazione basata sull'interfaccia utente non è accettabile, quindi è necessario pensare a cosa accadrà se si avvia più ritardi (ovvero se è attivato da un clic sul pulsante) - considerare la disabilitazione di tale pulsante o l'annullamento del timer / dell'attività o assicurarsi che sia ritardato l'operazione può essere eseguita più volte in sicurezza.


5
Se si tratta di un'applicazione console, l' Thread.Sleepavviso potrebbe non essere così importante.
Merlyn Morgan-Graham,

1
Esiste un quarto timer: System.Web.UI.Timer , un componente ASP.NET che esegue postback asincroni o sincroni delle pagine Web a intervalli regolari.
David,

1
Dovrebbe essere la risposta migliore. Se questo avesse un esempio per l'utilizzo di uno dei timer, otterrebbe più voti ...
Mercutio,

Cody Grey, puoi aggiungere una await Task.Delay()versione e un commento in linea che l'app console probabilmente vorrebbe usare Sleep(non asincrona Main) o Delay(asincrona Main)
Alexei Levenkov,

1
@CodyGray fatto.
Alexei Levenkov,

39

Per 2.3 secondi dovresti fare:

System.Threading.Thread.Sleep(2300);

6
System.Threading.Thread.Sleep(
    (int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);

O con usingdichiarazioni:

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

Preferisco questo a 1000 * numSeconds(o semplicemente 3000) perché rende più ovvio ciò che sta succedendo a qualcuno che non ha mai usato Thread.Sleepprima. Documenta meglio le tue intenzioni.


2
+1 per TimeSpan oltre 1000 *
Lefty

Con .NET 4 in poi è possibile utilizzare Thread.Sleep(TimeSpan)direttamente, senza dover eseguire il cast in un int.
Holf,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.