6
votes

Comment mettre à jour des boîtes de texte dans le fil principal d'un autre fil?

Comment vous mettez à jour les textes de texte et les étiquettes dans le thread principal à partir d'un nouveau thread en exécutant une classe différente.

mainform.cs (fil principal) xxx

J'ai regardé Aux exemples ici mais je ne peux pas sembler le faire correctement. S'il vous plaît que quelqu'un pourrait donner de bons liens.

J'ai recommencé de nouveau, donc je ne gâche pas mon code. Si quelqu'un aimerait mettre en place un exemple de travail avec mon exemple, ce serait génial.

aussi Si je devais mettre à jour plusieurs objets tels que textesboxes et étiquettes, etc., quelle serait la meilleure façon d'y aller, avoir une méthode pour chaque zone de texte ou y a-t-il un moyen Pour ce faire avec une méthode?


1 commentaires

Bienvenue à cela. Vous pouvez modifier votre question pour ajouter des informations supplémentaires et vous pouvez laisser des commentaires sur les réponses à une question que vous avez posée (et sur quoi que ce soit après avoir frappé 50 représentants).


3 Réponses :


4
votes

Vous pouvez appeler le begininvoke Méthode , qui mettra en ligne une déléguée à exécuter de manière asynchrone sur le fil de l'interface utilisateur.

Si vous avez besoin du fil d'arrière-plan pour attendre que la fonction se termine sur le thread d'interface utilisateur, vous pouvez appeler invoquer à la place.

Notez que vous aurez besoin d'une référence à l'instance de votre formulaire; Vous devriez probablement passer cela au constructeur et stockez-le dans un champ privé.


Le Backworker composant fera tout cela en utilisant automatiquement la méthode ReportProgress ; Vous devriez envisager d'utiliser.


4 commentaires

Merci pour la réponse, mais je suis nouveau à C # et aurait besoin d'un exemple pour travailler afin que je puisse comprendre comment cela fonctionne.


@tiptop: Vous devriez probablement utiliser un travailleur d'arrière-plan. MSDN a des exemples .


Tout développeur Winforms devrait comprendre comment mettre à jour l'interface utilisateur d'une manière threadsafe, et les deux approches sont des options valides pour comprendre


... aussi mérite aussi d'avertir que le synchronisationContext.begininvoke () utilisé pour basculer sur le thread de l'interface utilisateur est différent de délégué.begininvoke () , identique pour invoke () sur chaque type . Si vous faites des winforms multithreads, alors cette ambiguïté peut gâcher avec vous



8
votes

invoquer ou begininvoke, par exemple xxx


@tiptopjones Je suppose que vous demandez également comment obtenir une référence au formulaire. Vous pouvez faire de votre méthode Helloworld Prendre un paramètre d'objet, utilisez le délégué paramétrasedTheadStart, puis transmettez une référence au formulaire sous forme de paramètre sur la méthode thread.start. Mais je suggérerais de lire sur les méthodes anonymes qui le rend beaucoup plus facile et que tout garde fortement tapé. xxx

lorsque vous êtes à l'aise avec qui vous pouviez lire sur les expressions de Lambda et faire C'est comme: xxx


1 commentaires

Hé, c'est préférable de modifier votre question pour ajouter plus d'informations plutôt que de fournir une autre réponse.



1
votes

La manière préférée dans Winforms est d'utiliser la synchronisationContext xxx


0 commentaires