J'ai une simple boucle C# foreach, comment puis-je sortir de la boucle quand on appuie sur un bouton? Ce n'est pas dans un thread backgroundWorker donc je ne peux pas utiliser backgroundWorker.CancellationPending.C# Saut de boucle sur la touche Appuyez sur
Répondre
Créez un indicateur booléen dans le formulaire. Attachez un gestionnaire d'événements à l'événement click et définissez l'indicateur sur true dans le gestionnaire d'événements.
Vérifiez le drapeau dans la boucle et si c'est vrai, appelez "break". (Une meilleure option serait d'utiliser une boucle while au lieu d'une boucle for avec la vérification de l'indicateur dans la condition while)
Il est évident que la boucle for doit être sur une certaine forme de thread d'arrière-plan, sinon l'interface graphique l'emporte. t être réactif. Si vous ne savez pas comment procéder, consultez le ThreadPool.QueueUserWorkItem ou le BackgroundWorker. Si vous utilisez un BackgroundWorker, vous pouvez utiliser la méthode intégrée CancelAsync() au lieu de coder votre propre drapeau d'annulation. [Edit: Comme indiqué par d'autres (ci-dessous) et discuté plus en profondeur here et here;
vous ne devez soit verrouillage avant d'accéder à la bool ou marquer comme volatile]
[Ne pas oublier de définir l'état correct du drapeau avant de commencer la boucle.]
Évidemment, le drapeau doit être volatile, ou l'accès doit être synchronisé. – EFraim
efraim, pourquoi auriez-vous besoin de synchroniser l'accès à un simple champ bool? L'utilisateur ne peut pas très bien appuyer sur le bouton qui démarre la boucle ET sur le bouton qui l'annule en même temps, n'est-ce pas? –
@EFraim. Je ne suis pas sûr de cela. Je ne pense pas que vous ayez besoin de le verrouiller, car vous ne l'écrivez que d'un endroit (l'événement click button). La boucle for ne fait que la lire, donc même si la lecture et l'écriture se sont produites en même temps, le pire des cas est qu'il lui suffirait d'effectuer une nouvelle itération de boucle avant de s'arrêter. Quelqu'un peut-il confirmer cela? –
Voici un sans but bonne solution.
Appelez Application.DoEvents()
à chaque itération de votre boucle. Lors d'un clic sur un bouton, définissez une variable sur Vrai et, en boucle, vérifiez cette variable. Si c'est vrai, cassez 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 fil de fond.
Je suis d'accord. C'est une solution pas si bonne. N'utilisez pas DoEvents. Mettez la boucle for sur un thread d'arrière-plan correctement en utilisant un worker d'arrière-plan ou ThreadPool.QueueUserWorkItem() –
+1 pour quelque chose qui fonctionne réellement, même si c'est une solution plutôt laide qui ne change pas d'échelle ... Vous pouvez ajouter un compteur et appelez DoEvents toutes les n: ièmes itérations pour réduire les pertes de performances. – Guffa
Vous pouvez utiliser DoEvents, comme suggéré par Aamir, comme solution rapide.
Pour une solution plus évolutive et maintenable, vous devez déplacer le travail vers un thread séparé. Ensuite, il est plutôt trivial d'avoir un événement de clic sur un bouton pour arrêter la boucle. D'un autre côté, il y a un peu plus de travail pour communiquer le résultat au thread de l'interface utilisateur.
- 1. IME - Comment gérer la touche Appuyez sur
- 2. Asp.Net Search, trouvé des changements sur la touche Appuyez sur
- 3. ASP.NET: Appeler la méthode codebehind sur Entrée Appuyez sur la touche dans le formulaire
- 4. iPhone Slide Appuyez sur Supprimer
- 5. En appuyant sur une touche dans C#
- 6. Appuyez sur Entrée pour continuer dans C
- 7. Windows Forms - Appuyez sur la touche pour activer le bouton de soumission.
- 8. iPhone: appuyez sur un bouton par programmation
- 9. .NET 3.5 GridView - Sélectionnez plusieurs lignes avec la touche Ctrl appuyez sur
- 10. widget étiquette GWT recevoir le focus lorsque vous appuyez sur la touche tab
- 11. Java TelnetClient se bloque à "appuyez sur n'importe quelle touche pour continuer"
- 12. Appuyez sur Entrée pour continuer
- 13. Comment VS compile-t-il les applications de la console pour afficher "Appuyez sur une touche pour continuer"?
- 14. Java - changer de focus sur la touche
- 15. Comment éviter le son ding lorsque vous appuyez sur la touche Escape pendant la mise au point d'un TEdit?
- 16. Comment charger une vue sur un bouton, appuyez sur?
- 17. UpdatePanel ne se déclenche pas lorsque vous appuyez sur Entrée
- 18. Fermer un contrôle lorsque vous appuyez sur Entrée
- 19. C# - Syntaxe Lambda pour la boucle sur DataGridView.Rows
- 20. VB.NET: La boîte de dialogue se ferme-t-elle lorsque vous appuyez sur Entrée?
- 21. Mac OSX: introduction d'un délai entre le collage et la touche Entrée, appuyez sur, ou entre n'importe quelle séquence
- 22. C# Désactiver la touche TAB
- 23. Zone de texte WPF qui met uniquement à jour la liaison lorsque vous appuyez sur Entrée
- 24. Continuer sur l'erreur dans la boucle
- 25. C++ boucle de sortie basée sur l'entrée au clavier
- 26. Interception de la touche Nokia Ctrl/Chr en appuyant sur
- 27. Capture de la touche Windows dans C# (wpf)
- 28. Gérer plusieurs événements vous maintenez la touche C fenêtres # forme
- 29. onkeypress = "return isNumberKey (événement, this);" appelez la fonction deux fois dans IE8 par appuyez sur javascript
- 30. Utilisation de la touche ALT sur Komodo pour Mac OS X
La boucle foreach est-elle utilisée sur un filetage séparé? ou sur le fil de l'interface utilisateur? – ThePower
La boucle est-elle en cours d'exécution sur un autre thread? – AaronLS
Si la boucle se trouve sur le thread d'interface utilisateur, le gestionnaire d'événements de clic de bouton ne sera pas atteint tant que la fonction contenant la boucle ne sera pas terminée. – ThePower