3 votes

C# Sortez de la boucle lors de l'appui sur le bouton

J'ai une simple boucle foreach en C#, comment puis-je en sortir lorsque un bouton est pressé? Ce n'est pas dans un thread backgroundWorker donc je ne peux pas utiliser backgroundWorker.CancellationPending.

6voto

Simon P Stevens Points 17536

Créez un drapeau booléen dans le formulaire. Attachez un gestionnaire d'événements à l'événement de clic des boutons et définissez le drapeau sur true dans le gestionnaire d'événements.

Vérifiez le drapeau dans la boucle et s'il est true, appelez "break". (Une meilleure option serait d'utiliser une boucle while au lieu d'une boucle for avec la vérification du drapeau dans la condition while)

Évidemment, la boucle for devra être exécutée sur un type de thread en arrière-plan sinon l'interface utilisateur ne sera pas réactive. Si vous ne savez pas comment faire cela, consultez soit ThreadPool.QueueUserWorkItem soit le BackgroundWorker. Si vous utilisez un BackgroundWorker, vous pouvez utiliser la méthode CancelAsync() intégrée au lieu de coder votre propre drapeau d'annulation.

[Edit: Comme l'ont souligné d'autres (ci-dessous) et discuté plus en détail ici et ici; vous devez soit verrouiller avant d'accéder au booléen, soit le marquer comme volatile]

[N'oubliez pas de définir l'état correct du drapeau avant de démarrer la boucle.]

4voto

Aamir Points 8357

Voici une solution pas très bonne.

Appelez Application.DoEvents() à chaque itération de votre boucle. Sur Button-Click, définissez une variable sur True et dans la boucle, vérifiez cette variable. Si elle est vraie, arrêtez sinon continuez.

Comme je l'ai dit, ce n'est pas une très bonne solution. Application.DoEvents() peut être très dangereux. La meilleure option ici est d'avoir un thread en arrière-plan.

0voto

Guffa Points 308133

Vous pouvez utiliser DoEvents, comme l'a suggéré Aamir, comme solution rapide.

Pour une solution plus évolutive et maintenable, vous devez déplacer le travail dans un thread séparé. Ensuite, il est assez trivial d'avoir un événement de clic sur un bouton définir un drapeau pour arrêter la boucle. D'autre part, il y a un peu plus de travail pour communiquer le résultat de retour au thread UI.

Prograide.com

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.

Powered by:

X