Comment ajouter un délai de 2 ou 3 secondes [fermé]

129

Comment puis-je ajouter un délai à un programme en C #?

Mulder
la source
2
Il existe plusieurs façons de procéder, mais pourquoi avez-vous besoin d'ajouter un délai? Si nous savions, nous serions en mesure de suggérer la manière la plus appropriée de le faire.
ChrisF
3
Cette question est désespérément sous-documentée pour recommander Thread.Sleep ().
Hans Passant
1
Juste pour clarifier, j'ai voté pour clore cette question parce que vous n'avez pas fourni suffisamment de détails pour que quiconque puisse donner une réponse de bonne qualité. Je suis parfaitement disposé à la rouvrir en tant que question valable si vous ajoutez plus de détails sur exactement ce que vous essayez de faire. Voter pour fermer tôt est un moyen d'éviter un flot de réponses «bruyantes» à des questions de mauvaise qualité. Une fois que vous avez ajouté plus de détails, laissez-moi un commentaire et / ou marquez un mod pour le faire rouvrir.
Cody Gray
14
Mauvaise décision de clore cette question. C'est une question, et il est normal qu'elle soit de nature générique. Je l'ai parfaitement compris.
user2430797
5
Encore une autre question que je cherchais, répondue par une question qui a été fermée sans raison.
Glenn Maynard

Réponses:

177

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.Sleepest 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 .

digEmAll
la source
13
Évitez d'utiliser Thead.Sleep cause Cela empêchera complètement le Thread actuel de faire quoi que ce soit jusqu'à la fin de la durée.
Mohammed Swillam
7
@Mohammed: oui, bien sûr, cela bloquera complètement la bande de roulement. Mais parfois cela peut être utile ... cela dépend vraiment de ce dont l'OP a besoin ...
digEmAll
12
Comme je ne peux pas publier de nouvelle réponse, j'aimerais faire un commentaire - Si vous ne voulez pas qu'il bloque le programme, vous pouvez utiliser await Task.Delay(milliseconds). Cela a fonctionné pour moi :)
SaiyanGirl
Dans mon cas, je n'ai pas pu utiliser await car j'ai été appelé à partir d'une partie du programme écrite par quelqu'un d'autre. Ce n'est pas attendu, mais si je "bloque", je peux travailler pendant 10 secondes avant que mes affaires ne soient arrêtées. Dormir 2 secondes fonctionne comme un charme;) Donc, dans certains cas, c'est ainsi.
ecth
@MohammedElSayed: La réponse dépend. Tout dépend de l'intention de l'utilisation. Quant à mon cas, j'ai besoin de mettre le thread en veille pendant 0,6 seconde précisément afin d'éviter une contrainte d'index lors de l'insertion dans la base de données.
GunWanderer
61

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:

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

Ne pas utiliser Thread.Sleepsi votre application doit traiter des entrées sur ce thread en même temps (WinForms, WPF), car Sleepcela 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.Delaymeilleure option).

En plus des minuteries et Sleepvous pouvez utiliser Task.Delayquelle est la version asynchrone de Sleepqui 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 Mainméthode d'une application console si vous utilisez C # 7.1 ( Async main sur les blogs MSDN ).

Remarque: retarder l'opération avec Sleepa 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é.

Cody Gray
la source
5
S'il s'agit d'une application console, l' Thread.Sleepavertissement peut ne pas être aussi important.
Merlyn Morgan-Graham
1
Il existe une quatrième minuterie: System.Web.UI.Timer , un composant ASP.NET qui effectue des publications de page Web asynchrones ou synchrones à intervalle régulier.
David
1
Devrait être la meilleure réponse. Si cela avait un exemple d'utilisation de l'un des minuteries, il obtiendrait plus de votes ...
Mercutio
Cody Gray, pouvez-vous ajouter une await Task.Delay()version et commenter en ligne que l'application console voudra probablement utiliser Sleep(non async Main) ou Delay(async Main)
Alexei Levenkov
1
@CodyGray terminé.
Alexei Levenkov
39

Pendant 2,3 secondes, vous devez faire:

System.Threading.Thread.Sleep(2300);
Mitja Bonca
la source
6
System.Threading.Thread.Sleep(
    (int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);

Ou avec des usingdé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.Sleepauparavant. Il documente mieux votre intention.

Merlyn Morgan-Graham
la source
2
+1 pour TimeSpan sur 1000 *
Lefty
Avec .NET 4 et les versions ultérieures, vous pouvez utiliser Thread.Sleep(TimeSpan)directement, sans avoir à effectuer un cast en int.
Holf