Comment ajouter un délai à un programme en C# ?
Évitez d'utiliser Thead.Sleep car il bloquera complètement le Thread actuel en l'empêchant de faire QUELQUE CHOSE jusqu'à la fin de la durée.
Comment ajouter un délai à un programme en C# ?
Vous pourriez utiliser Thread.Sleep()
fonction, par exemple
int milliseconds = 2000;
Thread.Sleep(milliseconds);
que s'arrête complètement l'exécution du thread actuel pendant 2 secondes.
Probablement le scénario le plus approprié pour Thread.Sleep
c'est lorsque vous voulez 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. Réponse de Cody .
Évitez d'utiliser Thead.Sleep car il bloquera complètement le Thread actuel en l'empêchant de faire QUELQUE CHOSE jusqu'à la fin de la durée.
@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 le PO a besoin...
Puisque je ne peux pas poster une nouvelle réponse, j'aimerais commenter -- Si vous ne voulez pas qu'il bloque le programme, vous pouvez utiliser await Task.Delay(milliseconds)
. Cela a marché pour moi :)
Utilisez un minuteur dont l'intervalle est réglé sur 2-3 secondes.
Vous avez le choix entre trois options différentes, en fonction du type d'application que vous rédigez :
N'utilisez pas Thread.Sleep
si votre application doit traiter des entrées sur ce thread en même temps (WinForms, WPF), car Sleep
bloquera complètement le thread et l'empêchera de traiter d'autres messages. Dans l'hypothèse d'une application à un seul thread (comme c'est le cas pour la plupart d'entre elles), l'ensemble de votre application cessera de répondre, au lieu de simplement retarder une opération comme vous l'aviez probablement prévu. Notez qu'il est possible d'utiliser Sleep dans une application purement console car il n'y a pas d'"événements" à gérer ou de threads séparés (également Task.Delay
est une meilleure option).
En plus des minuteries et des Sleep
vous pouvez utiliser Task.Delay
qui est une version asynchrone de Sleep
qui ne bloque pas le traitement des événements par le thread (s'il est utilisé correctement - ne le transformez pas en sommeil infini avec la fonction .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.
}
Le même await Task.Delay(2000)
peut être utilisé dans un Main
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 proviennent du lancement potentiel de plusieurs opérations avec des timers/ Delay
. Malheureusement, le gel des applications basées sur l'interface utilisateur n'est pas acceptable. Vous devez donc penser à ce qui se passera si vous lancez plusieurs retards (c'est-à-dire s'ils sont déclenchés par le clic d'un bouton) - envisagez de désactiver ce bouton, d'annuler la minuterie/tâche ou de vous assurer que l'opération retardée peut être effectuée plusieurs fois en toute sécurité.
S'il s'agit d'une application console, le Thread.Sleep
L'avertissement n'est peut-être pas aussi important.
Il y a une 4ème minuterie : System.Web.UI.Timer Ce composant ASP.NET effectue des retours de pages Web asynchrones ou synchrones à intervalles réguliers.
Ce devrait être la meilleure réponse. Si cette réponse comportait un exemple d'utilisation d'un des minuteurs, elle obtiendrait plus de votes...
System.Threading.Thread.Sleep(
(int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);
Ou avec 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 pas utilisé Thread.Sleep
avant. Cela documente mieux votre intention.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
3 votes
Il existe plusieurs façons de procéder, mais pourquoi devez-vous ajouter un délai ? Si nous le savions, nous serions en mesure de vous suggérer la manière la plus appropriée de le faire.
4 votes
Cette question est désespérément sous-documentée pour recommander Thread.Sleep().
2 votes
Juste pour clarifier, j'ai voté pour fermer cette question parce que vous n'avez pas fourni assez de détails pour que quelqu'un puisse donner une réponse de qualité. Je suis tout à fait disposé à la rouvrir en tant que question valide si vous ajoutez quelques détails supplémentaires sur ce que vous essayez de faire exactement. Le vote de fermeture anticipée est un moyen d'éviter un flot de réponses "parasites" à des questions de mauvaise qualité. Une fois que vous aurez ajouté plus de détails, laissez-moi un commentaire et/ou signalez un mod pour que la question soit rouverte.
0 votes
Merci, c'est bon, le problème est déjà résolu.
25 votes
Mauvaise décision de fermer cette question. C'est une question, et il est normal qu'elle soit de nature générique. Je l'ai parfaitement comprise.
7 votes
Encore une question que je cherchais, à laquelle on a répondu par une question qui a été fermée sans raison.
1 votes
C'est pourquoi il faut rouvrir cette question. . Il est maintenant périmé mais personne ne peut ajouter une réponse actualisée car il est fermé.
0 votes
Réouvrons...