Mettre en pause une méthode pour l'ensemble # de millisecondes
J'ai besoin de faire une sorte de "délai d'attente" ou de pause dans ma méthode pendant 10 secondes (10 000 millisecondes), mais je ne suis pas sûr que si les conditions suivantes ne fonctionnent pas comme je n'ai pas de multi-threading.
Thread.Sleep(10000);
Je vais essayer de l'utiliser code actuel, mais je vous serais reconnaissant si quelqu'un pouvait expliquer la meilleure et la façon correcte de le faire, surtout si le code ci-dessus ne fonctionne pas correctement. Merci!
Mise à JOUR: Ce programme est en fait une application console dans la fonction en question est en train de faire beaucoup de HTTPWebRequests pour un serveur, je tiens à le retarder pour un montant spécifié en millisecondes. Donc, pas de rappel est nécessaire - tout ce qui est nécessaire est un "inconditionnel pause" - fondamentalement juste la chose s'arrête pendant 10 secondes, puis continue à aller. Je suis heureux que le C# considère cela comme un fil rouge, Fil.Le sommeil(...) serait de travailler. Merci tout le monde!
source d'informationauteur Maxim Zaslavsky | 2009-07-01
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas avoir multi-threading, mais vous êtes toujours en cours d'exécution au sein d'un thread: tout le code s'exécute dans un thread.
Appel
Thread.Sleep
sera en effet de mettre en pause le thread courant. Voulez-vous vraiment à inconditionnellement pause de 10 secondes, ou voulez-vous être en mesure d'être "réveillé" par quelque chose d'autre qui se passe? Si vous n'êtes en fait en utilisant un thread, appelantSleep
peut-être bien le meilleur moyen d'avancer, mais cela dépendra de la situation.En particulier, si vous écrivez un GUI application vous ne pas souhaitez utiliser
Thread.Sleep
de la thread de l'INTERFACE utilisateur, sinon, votre ensemble de l'application cesse de répondre pendant 10 secondes.Si vous pouviez donner plus d'informations à propos de votre demande, qui nous aiderait à vous conseiller mieux.
Qui va en effet mettre en pause l'exécution du thread/méthode pour 10 secondes. Voyez-vous un problème spécifique?
Noter que vous ne devriez pas
Sleep
le thread d'INTERFACE utilisateur serait - il préférable de faire un rappel de la place.Note également qu'il existe d'autres moyens de bloquer un thread qui permettent un accès plus simple à obtenir ce que ça va à nouveau (si vous trouvez qu'il est OK après 2s); comme
Monitor.Wait(obj, 10000)
(permettant à un autre thread pourPulse
si nécessaire pour le réveiller):Vous pouvez faire cela avec
Thread.Interrupt
trop, mais IMO c'est messier.Vous pouvez utiliser un thread séparé pour le faire:
Mais, si c'est une application Windows Forms, vous aurez besoin d'invoquer le code après le retard de la thread Gui (cet article, par exemple: Comment mettre à jour l'interface graphique à partir d'un autre thread en C#?).
[Modifier] Viens de voir votre mise à jour. Si c'est une application console, puis ce sera le travail. Mais si vous n'avez pas utilisé de plusieurs threads jusqu'à présent, alors vous devez être conscient que ce code sera exécuté dans un thread différent, ce qui signifie que vous aurez à prendre soin de fil les problèmes de synchronisation.
Si vous n'avez pas besoin de fond de travailleurs, s'en tenir à "garder les choses simples".
Voici une pause de classe qui fera une pause pour les millisecondes et l'habitude de consommer des ressources CPU.
Oui, qui fonctionne très bien.
Vous n'avez pas à avoir plusieurs threads à utiliser certaines des méthodes de la classe Thread. Vous avez toujours au moins un thread.
Fil.Le sommeil est très bien, et autant que je sache, la bonne façon. Même si vous n'êtes pas Multithread: Il y a toujours au moins un Fil, et si vous envoyer que de dormir, il dort.
Un autre (mauvais)est un spinlockquelque chose comme:
C'est malheureusement toujours d'être utilisé par des personnes, et bien qu'elle mettra fin à votre programme de 10 secondes, il sera exécuté à 100% d'Utilisation CPU (Bien, sur les systèmes Multi-Core c'est une base).
Pour un délai d'attente, vous devez avoir une statique volatils boolean isRunning champ de la classe. Lorsque le nouveau thread démarre, le isRunning doivent devenir de véritables, et à la fin doit devenir faux.
Le thread principal doit avoir une méthode qui effectue une boucle pour la isRunning pendant le délai que vous définissez. Lorsque le délai d'attente se termine, vous devez mettre en œuvre la logique. Mais, n'utilisez jamais l'abandonner méthode de fil.
Une pause... il n'y a pas une solution simple et efficace. Cela dépend de ce que vous faites à l'intérieur du fil. Cependant, vous pouvez regarder Moniteur.Attendre.