Comment lire une zone de texte.Valeur de texte à partir d'un autre thread dans WPF?
Dans mon WPF formulaire, j'ai une zone de texte.
Lorsqu'une minuterie s'écoule, le contenu de la zone de texte doit être récupérée.
Le timer est écoulé de travail dans un autre thread de l'INTERFACE utilisateur.
La question est plutôt deux fois:
- Ce qui est le plus facile, le plus lisible la lecture de la valeur à partir d'un thread GUI de la croix-thread (j'en ai trouvé plusieurs et ils ont l'air trop verbeux pour ce qui devrait être quelque chose de vraiment basique)?
- Je ne peux pas lire le texte de manière non-bloquante? Je ne se soucient pas de la sécurité des threads dans ce cas.
--EDIT--
J'ai utilisé le Répartiteur, mais a eu plus de commentaires appel, puis ce Jean:
originalTextBox.Dispatcher.Invoke(
DispatcherPriority.Normal,
(ThreadStart) delegate{text=originalTextBox.Text;}
);
Ne serait pas l'esprit même terser. L'accès à une propriété du texte devrait être tout à fait de base.
OriginalL'auteur Boris Callens | 2009-04-02
Vous devez vous connecter pour publier un commentaire.
Depuis que la question ne précise pas le C#, j'ai voulu montrer une solution simple pour VB.NET:
OriginalL'auteur Jrabauer
Oisin est à droite, vous avez besoin de regarder Répartiteur. Quelque chose comme cela devrait fonctionner, et n'est pas trop verbeux:
OriginalL'auteur John Myczek
Vous pouvez soit:
Dispatcher
pour programmer un message à exécuter dans le thread de l'INTERFACE utilisateur à partir d'un thread d'arrière-plan. UnDispatcherPriority
deSend
, vous obtiendrez la réponse la plus rapide possible.Minuterie
à exécuter périodiquement des messages sur le thread d'INTERFACE utilisateur.OneWayToSource
de liaison pour connecter leText
propriété d'un bien immobilier sur votre arrière-plan du composant. De cette façon, vous n'aurez pas à faire tout le travail pour obtenir la valeur de la propriété - il y aura déjà été fournie à votre composant.OriginalL'auteur Kent Boogaart
Il n'y a pas de "quick hack" pour la lecture d'un objet graphique de valeurs à partir d'une autre thread que celui qui l'a créé. WPF sera tout simplement pas vous permettre de le faire. Windows Forms puisse se plaindre de temps en temps, mais WPF est de manière plus stricte.
Vous avez besoin d'apprendre sur le Répartiteur. Il peut ressembler à verbeux, mais il n'est pas vraiment difficile à comprendre. Vous passer un délégué à l'expéditeur qui pointe vers une méthode appelée sur le thread GUI, et il le fait.
Voici un bel exemple simple:
http://www.switchonthecode.com/tutorials/working-with-the-wpf-dispatcher
Je ne suis pas vraiment à la recherche d'un moyen rapide de hack, je suis à la recherche de quelque chose de lisible. Un court de main si vous voulez.
désolé de faire éclater votre bulle, mais en utilisant le répartiteur EST un raccourci. 🙂 vous voulez écrire votre propre répartiteur/marshaller?
OriginalL'auteur x0n
Une autre réponse consiste à utiliser Jeff Wilcox SmartDispatcher classe.
Quelque part dans le constructeur ou l'événement Load de faire un SmartDispatcher.Initialize() (pour définir l'INTERFACE utilisateur répartiteur)
Puis n'importe où vous avez besoin de définir une propriété ou d'appeler une méthode:
La beauté de ceci est que vous n'avez pas besoin de savoir si c'est sur le thread d'INTERFACE utilisateur ou pas (et vous pouvez avoir besoin de le faire à partir de deux). Le SmartDispatcher prend soin de le fil de l'interrupteur si nécessaire.
Ci-dessus est asynchrone, mais si vous en avez besoin synchrone, il suffit d'ajouter une autre méthode pour appeler les Appeler au lieu de BeginInvoke.
OriginalL'auteur Wray Smallwood
Viens de passer par hasard ici. Un temps, j'ai juste commencé la construction d'une classe statique que je peux ajouter à mes projets pour un accès rapide à certaines des propriétés du contrôle. C'est lourd au fil du temps, mais rend les choses assez facile alors que de cacher beaucoup de répartiteur de code. Rudimentaire mais efficace. Peut vous donner quelques idées.
Je pouvais faire des choses comme ça:
Voici ce que le SafeGuiWpf dernier ressemblait, si vous le trouvez utile. (Pense qu'il fonctionne en NET 3, mais il a été un moment)
Rétrospectivement, peut-être rendus encore plus lisse si je n'ai que ces extensions de la classe.
OriginalL'auteur CFD
- Je utiliser l'extension suivante de la méthode pour contourner ce problème:
Et bien sûr, cette méthode doit être ajouté dans une autre classe statique.
OriginalL'auteur Amit Dash
Mon solutiosn...
Le code XAML:
et le cs du Fichier:
la deuxième zone de texte est un type de test tandis que le thread est en cours d'exécution
OriginalL'auteur a52