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 .
É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:
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()).
publicasyncvoidClickHandler(...){// whatever you need to do before delay goes here awaitTask.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é.
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)
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.
Réponses:
Vous pouvez utiliser la
Thread.Sleep()
fonction, par exemplecela 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: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 .
la source
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:
System.Timers.Timer
System.Windows.Forms.Timer
System.Threading.Timer
Ne pas utiliser
Thread.Sleep
si votre application doit traiter des entrées sur ce thread en même temps (WinForms, WPF), carSleep
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 uneTask.Delay
meilleure option).En plus des minuteries et
Sleep
vous pouvez utiliserTask.Delay
quelle est la version asynchrone deSleep
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()
).La même chose
await Task.Delay(2000)
peut être utilisée dans uneMain
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é.la source
Thread.Sleep
avertissement peut ne pas être aussi important.await Task.Delay()
version et commenter en ligne que l'application console voudra probablement utiliserSleep
(non asyncMain
) ouDelay
(asyncMain
)Pendant 2,3 secondes, vous devez faire:
la source
Ou avec des
using
déclarations:Je préfère cela à
1000 * numSeconds
(ou simplement3000
) 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.la source
Thread.Sleep(TimeSpan)
directement, sans avoir à effectuer un cast en int.