Système.De Windows.Le filetage.Répartiteur et WinForms?
Un System.De Windows.Le filetage.Répartiteur
travail sur l'INTERFACE utilisateur-fil d'un WinForms
application?
Si oui, pourquoi? Il est à venir à partir de WindowsBase.dll ce qui semble être un WPF
composant.
Si non, comment puis-je invoquer des unités de travail de retour sur l'INTERFACE utilisateur-fil? J'ai trouvé de Contrôle.BeginInvoke()
, mais il semble maladroite pour créer un contrôle uniquement pour référence le thread d'origine.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
Dispatcher
même dans une application WinForms.Si vous êtes sûr d'être sur un thread d'INTERFACE utilisateur (par exemple dans un bouton.Cliquez sur gestionnaire),
Dispatcher.CurrentDispatcher
vous donne le thread d'INTERFACE utilisateur répartiteur, que vous pourrez ensuite utiliser pour l'envoi de threads d'arrière-plan pour le thread d'INTERFACE utilisateur, comme d'habitude.Répartiteur est un WPF composant, pas un WinForms composant.
Si vous voulez de répartition des éléments sur le thread de l'INTERFACE utilisateur, alors que vous auriez à utiliser de Contrôle.BeginInvoke comme vous l'avez déjà trouvé, ou de réagir à ResetEvents/WaitObjects dans les threads.
Généralement en invoquant des éléments de travail sur le thread de l'INTERFACE utilisateur est une mauvaise chose, sauf si c'est une INTERFACE utilisateur pièce de travail (ie. la mise à jour d'un contrôle de contenu ou de quelque chose), auquel cas le Contrôle.BeginInvoke() serait suffisante.
J'ai fourni un exemple d'utilisation de
System.Windows.Threading.Dispatcher
en Windows Form dans ma réponse à la question "en Parallèle de la Programmation à l'aide de TPL sur WinForms" depuis la réponse à votre question:est soit trompeuses ou prêtant à confusion ou manque de l'usage de béton contexte:
button.Click
gestionnaire n'a pas l'assurance d'être sur le thread de l'INTERFACE utilisateur;L'on peut obtenir répartiteur de WinForm thread d'INTERFACE utilisateur:
dans l'événement clic du bouton gestionnaire ou n'importe où ailleurs (dans le constructeur du formulaire)
Et ensuite l'utiliser pour exécuter l'INTERFACE utilisateur à partir d'autres threads, voir plus de détails sur l'exemple ci-dessous dans ma réponse:
using System.Threading;
"Type ou de l'espace de "Dispatcher" n'a pas Pu être trouvé...."Utiliser le fond thread c'est l'INTERFACE utilisateur de pompe de messages conscients, Cet Article MSDN si la plupart du temps sur WPF ne fait état que le TAF est l'INTERFACE utilisateur courant, même pour les windows forms.
J'ai eu le même problème à l'aide de l'Oracle de la dépendance de la classe qui s'exécute dans son propre thread dans les Winforms,
Lors de l'événement OnChange viré de l'Oracle de la Dépendance, j'ai voulu montrer les changements dans DataGridView en définissant simplement
Source de données à eventargs.Les détails (qui est essentiellement un DataTable),
et il lance:
Système.InvalidOperationException est pas gérée par le code de l'utilisateur
Message=inter-threads non valide: le Contrôle 'dataGridView1' accessible à partir d'un thread autre que le thread qu'il a été créé.
StackOverflow utilisateur Brian Peiris ([email protected]) ,collègue de la mine m'a montré cette manière autour de:
Prendre un coup d'oeil à document d'information et voir si elle correspond à vos besoins.
Parfois un composant Timer est utile et facile à installer en WinForms, il suffit de mettre son intervalle et puis l'activer, puis assurez-vous que la première chose à faire dans son Cocher gestionnaire d'événement est de désactiver lui-même.
Je pense Minuteur s'exécute le code dans son propre thread, de sorte que vous pouvez encore avoir besoin de faire un BeginInvoke (appelé le WinForm objet de [cette]) pour exécuter votre Action.
vous pouvez le voir ci-dessus dans l'action au WebCapture outil (http://gallery.clipflair.net/WebCapture, le code source à: http://ClipFlair.codeplex.com, voir Outils/WebCapture dossier) que l'accaparement des captures d'écran de sites web. BTW, si vous voulez appeler le fichier exécutable à partir de ligne de commande, assurez-vous que vous allez dans les Propriétés du projet et à l'onglet Sécurité d'arrêt sécurité ClickOnce (sinon il ne peut pas accéder en ligne de commande)