Come posso aggiungere un ritardo a un programma in C #?
Come posso aggiungere un ritardo a un programma in C #?
Risposte:
È 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.Sleep
quando 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 .
await Task.Delay(milliseconds)
. Questo ha funzionato per me :)
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:
Non utilizzare Thread.Sleep
se l'applicazione deve elaborare contemporaneamente qualsiasi input su quel thread (WinForms, WPF), poiché Sleep
bloccherà 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 Sleep
puoi usare Task.Delay
la versione asincrona Sleep
che 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 Main
metodo di un'applicazione console se si utilizza C # 7.1 ( Async main sui blog MSDN ).
Nota: ritardare l'operazione con Sleep
ha 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.
Thread.Sleep
avviso potrebbe non essere così importante.
await Task.Delay()
versione e un commento in linea che l'app console probabilmente vorrebbe usare Sleep
(non asincrona Main
) o Delay
(asincrona Main
)
Per 2.3 secondi dovresti fare:
System.Threading.Thread.Sleep(2300);
System.Threading.Thread.Sleep(
(int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);
O con using
dichiarazioni:
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.Sleep
prima. Documenta meglio le tue intenzioni.
Thread.Sleep(TimeSpan)
direttamente, senza dover eseguire il cast in un int.