J'ai un Windows Form et une classe avec deux méthodes simples qui s'exécutent de manière récursive de manière non déterministe (ce qui signifie que la récursivité est inconnue, les deux peuvent appeler l'autre) ... Maintenant, il y a des points durant cette récursion au cours de laquelle je veux mettre en pause l'exécution et attendre qu'un utilisateur clique sur le bouton "Next Step". Ce n'est que lorsque le bouton est pressé que les fonctions récursives continuent. La classe s'exécute sur un thread séparé afin de ne pas bloquer l'interface utilisateur.Comment mettre en pause le fil d'arrière-plan, puis continuer sur le bouton cliquer?
Pendant cette pause, le formulaire récupérerait simplement la valeur de la classe et l'afficherait dans une zone de liste. Ensuite, après avoir appuyé sur le bouton, la récursivité continue jusqu'à la pause suivante(). J'ai besoin de cela pour que l'utilisateur puisse voir ce qui se passe dans la récursion étape par étape. Aussi je dois pouvoir mettre Pause() n'importe où dans la méthode récursive (même plusieurs fois) sans causer d'effets secondaires ...
La seule façon qui me vient à l'esprit est d'appeler la méthode Pause() dans qu'une boucle vérifie un drapeau verrouillé puis dort pendant un certain temps (le bouton mettrait alors le drapeau), mais j'ai eu de mauvaises expériences avec Thread.Sleep() dans Windows Forms (en verrouillant l'interface utilisateur) donc je regarde une autre option .
Existe-t-il un moyen propre de faire cela?
Cela a fonctionné avec une petite modification car l'utilisateur ne fait pas de pause, la fonction elle-même s'arrête. L'utilisateur effectue uniquement l'étape. Mais j'ai mis Reset() et WaitOne() dans ma Pause(), puis sur le bouton cliquez simplement sur Set(). Cela fonctionne comme prévu. C'est marrant comme je n'ai jamais remarqué cette classe. –
C'est ainsi que fonctionne AutoResetEvent. Il se réinitialise automatiquement lorsqu'un thread l'attend avec succès. –
Oui, AutoResetEvent fonctionne également pour mon scénario et crée un code plus court (d'une ligne). Donc maintenant je peux seulement appeler WaitOne() dans ma Pause() avec le reste du code laissé inchangé. –