Alternative à Thread.Sleep in C #?

J’ai un code qui, lorsqu’il est exécuté, exécute une série de lignes en séquence. Je voudrais append une pause entre les deux.

Actuellement, je l’ai comme ça

//do work Thread.Sleep(10800000); //do work 

Cela bloque toutefois le logiciel, et je pense que c’est parce que le temps de sumil est beaucoup trop long. J’ai cherché en ligne et j’ai trouvé un autre travail appelé Minuterie. Quelqu’un peut-il me montrer un exemple de code pour Timer qui fonctionne exactement comme Thread.sleep?

Merci d’avance.

Edit: le logiciel doit attendre 3 heures avant de poursuivre l’exécution du code. Ce logiciel est destiné à communiquer avec des machines et je ne peux pas laisser le rest du code s’exécuter en attendant 3 heures.

Votre logiciel se bloquerait si ce sumil était sur le thread principal. Gardez à l’esprit que le paramètre est en millisecondes. 10 800 000 millisecondes = 10 800 secondes

Une autre façon de passer le temps consiste à passer un object TimeSpan à la place. Ex:

 // Sleep for 10 seconds System.Threading.Thread.Sleep(new TimeSpan(0, 0, 10)); 

Quant à la timer:

Vous pouvez utiliser System.Timers.Timer ;

 Timer timer = new Timer(); timer.Interval = 20; // milliseconds timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); timer.AutoReset = true; // if not set you will need to call start after every event fired in the elapsed callback timer.Start(); 

Consultez cette référence MSDN sur la classe System.Threading.Timer . Il y a une bonne explication, tous les membres de la classe et un exemple de code à suivre lors des tests / apprentissages.

Cependant, le Timer doit être utilisé lorsque vous souhaitez déclencher un événement à un certain intervalle. Si vous souhaitez simplement suspendre l’exécution de votre application, vous devriez utiliser Thread.Sleep() . Cependant, comme de nombreuses personnes l’ont fait remarquer, vous faites dormir votre thread pendant une période prolongée.

UTILISEZ UN MINUTEUR!

 private DispatcherTimer Timer; public Constructor { Timer = new System.Windows.Threading.DispatcherTimer(); Timer.Tick += new EventHandler(Timer_Tick); Timer.Interval = new TimeSpan(0,0,10); Timer.Start(); } private void Timer_Tick(object sender, EventArgs e) { Timer.Stop(); Timer -= Timer_Tick; Timer = null; // DO SOMETHING } 

Votre problème est que vous bloquez le thread principal de votre application, qui est responsable de la maintenance de l’interface utilisateur. Tu ne devrais pas faire ça. Au lieu de cela, utilisez un minuteur – celui des formulaires est probablement le plus simple dans une application de formulaires, ou considérez BackgroundWorker. (Pour une attente aussi longue, une timer est probablement plus appropriée)

Le Thread.Sleep est ce que vous voulez utiliser pour cela, vous pouvez utiliser une période de sumil plus raisonnable que 3 heures.

Mettre à jour:

Après avoir lu certains commentaires, Thread.Sleep n’est probablement pas ce que vous voulez. Utilisez plutôt un System.Threading.Timer comme d’autres l’ont suggéré.

Voir Thread.Sleep (300) ne fonctionne pas correctement

Vous devez probablement utiliser le “Dispatcher”. Regardez ici aussi

Thread.Sleep serait généralement utilisé pour mettre en pause un thread séparé, pas dans le thread principal de votre application.

Le minuteur est généralement utilisé pour amener périodiquement le thread principal à arrêter ses opérations normales et à gérer un événement.

L’une ou l’autre méthode peut être utilisée pour exécuter périodiquement une fonction après un certain intervalle de temps.

Ce que je ne voudrais pas faire, c’est demander au fil principal de dormir pendant 3 heures.

Je pense que vous devriez utiliser un moniteur . Il vous aide à mettre en attente des objects et à libérer le verrou lorsque vous devez continuer à exécuter le programme.

Vous devriez trouver votre réponse ici: Synchronisation de threads sécurisée

Vous pouvez remplacer

 Thread.Sleep(X); 

par

 Task.WaitAll(Task.Delay(X)); 

Vous dormez le fil pendant 10800 secondes, ou 3 heures. Thread.Sleep () est conçu pour geler votre thread, tout ce qui ne peut pas fonctionner dans le logiciel pendant cette durée. Dans ce cas, la durée est de 18 minutes. Qu’essayez-vous de faire?