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.
Réponses
Trop de publicités?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.]
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.
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.