Je veux attendre 15 secondes, alors le contrôle devrait reprendre de la déclaration suivante.
Je n'ai rien d'autre à faire en attendant (attendant simplement). P>
Je sais que Il y a Le code serait comme celui-ci: p> thread.sleep (15000) code>. Ce que je ne sais pas, c'est la meilleure méthode d'attente? Quelles sont les limites de ceci? P>
8 Réponses :
Vous pouvez toujours utiliser une minuterie, puis exécuter du code après la durée définie. Toutefois, si vous n'avez rien à faire et que vous voulez juste attendre à un point particulier dans le code, je pense que thread.sleep (150000); est suffisant. [EDIT: orthographe] p>
thread.sleep semble une chose sensible à faire s'il n'y a rien d'autre à faire en attendant. Il met le fil à dormir pendant cette période afin qu'il n'utilise aucune ressource CPU. P>
Oui, toute autre méthode utiliserait la CPU et vous ne voulez pas que si tout ce que vous avez à faire, c'est attendre ...
Il est particulièrement utile dans les tests unitaires où vous devez simuler le temps Delta. La méthode ne peut pas quitter si thread.sleep () est moins mal dans cette situation particulière. Pour les intervalles de longue date, je me suis trompé en modifiant le temps système. Comme si vous posez l'ordinateur dans une machine à temps. Lorsque le test est effectué, il redevient le temps système à la normale.
L'inconvénient du thread.sleep est si cela est appelé dans votre fil d'interface graphique (le fil qui traite des événements de l'interface graphique, par exemple une méthode du gestionnaire de bouton, ou une méthode appelée à partir d'une touche, cliquez sur le gestionnaire, etc.). L'application semblera geler et être déroulante pour ces 15 secondes. P>
Ce serait parfaitement bien si vous aviez expliqué un fil séparé et appelé thread.sleep, en supposant que cela ne vous dérange pas que le fil ne faisait rien pendant 15 secondes. P>
L'alternative serait de créer une minuterie et de commencer après la STMT 2, et placez STMT 3 dans le gestionnaire d'événements de tick pour la minuterie et arrêtez également la minuterie dans ce gestionnaire. P>
Cela peut ne pas être une réponse directe à votre question. Je dirais vérifier si votre flux de processus est meilleur que de vérifier si le code est meilleur; -) p>
attendez-vous pendant 15 secondes pour vous assurer que STMT2; est complet? Si oui, ajoutez un gestionnaire, dès que STMNT 2 est exécuté, constituerait une meilleure solution (?) P>
Vous pouvez également utiliser une minuterie pour attendre.
Si vous voulez toujours attendre un délai donné, alors Gardez à l'esprit que votre fil dormira pendant toute la durée. Si, pour une raison quelconque, vous voulez que le fil reprenne plus tôt, vous ferez mieux d'utiliser la signalisation ou les rappel. En utilisant l'une d'entre elles au lieu de dormir code> est utile. De toute évidence, vous ne devriez pas faire cela sur un fil où les réponses opportunes sont attendues. p>
dormez code>, vous minimiserez le temps d'attente inutile. p>
Essayez quelque chose comme ce qui suit:
void Method() { console.log('statement 1'); console.log('statement 2'); var timer = new System.Threading.Timer( o => // timer callback { console.log('statement 2'); }, 15000, // Delay 0 // Repeat-interval; 0 for no repeat ); }
Il y a un problème avec cet exemple. Cela ne fonctionnera pas de manière fiable, car aucune référence à l'objet code> (code> est conservée n'importe où. Ainsi, il est soumis à la collecte des ordures. Plus votre retard est long, plus cela sera probablement un problème. De MSDN: Tant que vous utilisez une minuterie, vous devez conserver une référence. Comme avec n'importe quel objet géré, une minuterie est soumise à la collecte des ordures lorsqu'il n'y a aucune référence. Le fait qu'une minuterie soit toujours active ne l'empêche pas d'être collectée. I>
@Thorarin: Ah, bon point. J'ai tout oublié de ce petit fait. Je verrai si je peux corriger l'exemple.
Si vous souhaitez expédier le rappel sur le thread d'interface utilisateur, vous devez utiliser system.windows.forms.ticer code> à la place.
STMT1 ne compilera pas. Est-ce un mot clé C #?
Je ne sais pas 100%, mais si vous avez vraiment besoin de votre méthode pour revenir après 15 secondes, essayez de suivre:
Method() { stmt1(); stmt2(); int time = DateTime.Now.Millisecond; while (15*1000 > DateTime.Now.Millisecond - time) { Thread.Sleep(10) Application.DoEvents(); } stmt3(); }
void Method() { Statement1(); Statement2(); // Start the timer for a single 15 second shot. // Keep a reference to it (Mytimer) so that the timer doesn't get collected as garbage Mytimer = new System.Threading.Timer((a) => { // Invoke the 3rd statement on the GUI thread BeginInvoke(new Action(()=>{ Statement3(); })); }, null, 15000, // 15 seconds System.Threading.Timeout.Infinite); // No repeat }
Thread.sleep (15000) est bien pour C #. Pour Winforms, WPF ou ASP.NET, c'est une catastrophe.
Proche-duplicats: Stackoverflow.com/questions/1091710 , Stackoverflow.com/questions/407130 , Stackoverflow.com/Questtions/1208103 et Stackoverflow.com/questions/903688 .