Comment puis-je ajouter un délai à un programme en C #?
Comment puis-je ajouter un délai à un programme en C #?
Réponses:
Vous pouvez utiliser la Thread.Sleep()
fonction, par exemple
int milliseconds = 2000;
Thread.Sleep(milliseconds);
cela arrête complètement l'exécution du thread actuel pendant 2 secondes.
Le scénario le plus approprié Thread.Sleep
est probablement lorsque vous souhaitez retarder les opérations dans un autre thread, différent du principal, par exemple:
MAIN THREAD --------------------------------------------------------->
(UI, CONSOLE ETC.) | |
| |
OTHER THREAD ----- ADD A DELAY (Thread.Sleep) ------>
Pour d'autres scénarios (par exemple le démarrage des opérations après un certain temps, etc.), vérifiez la réponse de Cody .
await Task.Delay(milliseconds)
. Cela a fonctionné pour moi :)
Utilisez une minuterie avec un intervalle de 2 à 3 secondes.
Vous avez le choix entre trois options différentes, en fonction du type d'application que vous rédigez:
Ne pas utiliser Thread.Sleep
si votre application doit traiter des entrées sur ce thread en même temps (WinForms, WPF), car Sleep
cela verrouille complètement le thread et l'empêche de traiter d'autres messages. En supposant une application à un seul thread (comme la plupart le sont), l'ensemble de votre application cessera de répondre, plutôt que de simplement retarder une opération comme vous l'aviez probablement prévu. Notez qu'il peut être bien d'utiliser Sleep dans une application console pure car il n'y a pas d '"événements" à gérer ou sur un thread séparé (c'est également une Task.Delay
meilleure option).
En plus des minuteries et Sleep
vous pouvez utiliser Task.Delay
quelle est la version asynchrone de Sleep
qui ne bloque pas le thread de traiter les événements (si elle est utilisée correctement - ne la transformez pas en sommeil infini avec .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.
}
La même chose await Task.Delay(2000)
peut être utilisée dans une Main
méthode d'une application console si vous utilisez C # 7.1 ( Async main sur les blogs MSDN ).
Remarque: retarder l'opération avec Sleep
a l'avantage d'éviter les conditions de course qui découlent du démarrage potentiel de plusieurs opérations avec des minuteries / Delay
. Malheureusement, le gel d'une application basée sur l'interface utilisateur n'est pas acceptable, vous devez donc penser à ce qui se passera si vous démarrez plusieurs retards (c'est-à-dire s'il est déclenché par un clic sur un bouton) - envisagez de désactiver ce bouton, d'annuler le minuteur / tâche ou de vous assurer du retard l'opération peut être effectuée plusieurs fois en toute sécurité.
Thread.Sleep
avertissement peut ne pas être aussi important.
await Task.Delay()
version et commenter en ligne que l'application console voudra probablement utiliser Sleep
(non async Main
) ou Delay
(async Main
)
Pendant 2,3 secondes, vous devez faire:
System.Threading.Thread.Sleep(2300);
System.Threading.Thread.Sleep(
(int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);
Ou avec des using
déclarations:
Thread.Sleep((int)TimeSpan.FromSeconds(2).TotalMilliseconds);
Je préfère cela à 1000 * numSeconds
(ou simplement 3000
) parce que cela rend plus évident ce qui se passe pour quelqu'un qui n'a jamais utilisé Thread.Sleep
auparavant. Il documente mieux votre intention.
Thread.Sleep(TimeSpan)
directement, sans avoir à effectuer un cast en int.