2009-08-10 4 views
4

Je suis nouveau sur Windows Forms depuis le monde de Java Swing. Y a-t-il un équivalent pour Java SwingUtilities.invokeLater()? Ou, comment puis-je envoyer une tâche à exécuter sur le thread d'événement Windows Forms principal?Java invokeLater() équivalent dans Windows Forms?

Je suis en train d'effectuer une tâche d'arrière-plan en utilisant une API synchrone sur un thread distinct. À la fin de la tâche, je souhaite réactiver certains boutons désactivés. Mais quand je tente de le faire, je reçois une exception (à juste titre) parce que je modifie l'interface utilisateur sur un thread non-UI.

Comment puis-je mettre cette action en file d'attente sur le thread d'événement principal? Je n'ai pas trouvé la réponse à la recherche sur le web et SO, je devine parce que je ne pose pas la bonne question. Toute aide est la bienvenue, merci!

Répondre

13

Vous pouvez exécuter un délégué sur le thread d'interface utilisateur à l'aide de Control.Invoke ou Control.BeginInvoke. Une alternative est d'utiliser BackgroundWorker, qui enveloppe tout cela bien - c'est pratique si vous voulez seulement faire une chose pendant le traitement et une chose à la fin, mais si vous voulez effectuer des opérations arbitraires sur l'interface utilisateur, en utilisant Invoke/BeginInvoke est plus flexible.

J'ai une page sur l'utilisation Invoke/BeginInvoke dans mon threading tutorial. J'ai peur.

Vous pouvez également regarder Joe Albahari's threading tutorial.

2

Avez-vous regardé dans le BackgroundWorker?

+0

Merci Erik. J'étais au courant de BackgroundWorker, et je finirai par envelopper mon API actuellement synchrone. Pour l'instant, je voulais juste placer une interface utilisateur autour d'un outil de ligne de commande, donc j'avais juste besoin d'un moyen rapide et facile de l'exécuter sur un thread séparé. –