WPF Dispatcher {"Le thread appelant ne peut pas accéder à cet objet car un thread différent le possède."}
d'abord, je dois dire que je suis noob avec WPF et C#.
La demande: Créer Mandelbrot Image (GUI)
Mon répartiteur fonctionne parfaitement ce cas:
private void progressBarRefresh(){
while ((con.Progress) < 99)
{
progressBar1.Dispatcher.Invoke(DispatcherPriority.Send, new Action(delegate
{
progressBar1.Value = con.Progress;
}
));
}
}
Je reçois le Message (Titre) lors de tring pour ce faire, avec le code ci-dessous:
bmp = BitmapSource.Create(width, height, 96, 96, pf, null, rawImage, stride);
this.Dispatcher.Invoke(DispatcherPriority.Send, new Action(delegate
{
img.Source = bmp;
ViewBox.Child = img; //vllt am schluss
}
));
Je vais essayer d'expliquer comment mon programme fonctionne.
J'ai créé un nouveau Fil de discussion (parce que GUI ne pas la réponse) pour le calcul des pixels et les couleurs. Dans ce Fil(Méthode) Im en utilisant le Répartiteur pour Actualiser mon Image dans le ViewBox après les calculs sont prêts.
Quand je ne mets pas le calcul dans un Thread séparé alors je peux actualiser ou de construire mon Image.
source d'informationauteur Orri | 2010-06-05
Vous devez vous connecter pour publier un commentaire.
Juste au cas où vous souhaitez que l'objet soit partagée entre les différents threads puis toujours créer cet objet sur le thread de l'INTERFACE utilisateur. Plus tard, lorsque vous voulez accéder à l'objet, vous pouvez vérifier si vous avez accès à l'objet. Si vous n'avez pas d'accès, re-appeler la fonction avec le thread de l'INTERFACE utilisateur l'accès. exemple de code ci-dessous:
MSDN dit: "gelé Gelé peuvent être partagées entre les threads."
Peut-être ce fil pour vous aider: http://social.msdn.microsoft.com/Forums/en-US/windowswic/thread/9223743a-e9ae-4301-b8a4-96dc2335b686
Lorsque vous obtenez une
Dispatcher
vous obtenez un différent pour chaque thread différent.this.Dispatcher
peut-être vous donner une autre Répartiteur pas de l'INTERFACE utilisateur, de sorte que vous obtenez cette erreur.Essayez d'utiliser
Application.Current.Dispatcher
au lieu de cela, ce sera toujours le Répartiteur de la thread de l'INTERFACE utilisateur.Le même message d'erreur peut se produire si vous utilisez
Dispatcher.CurrentDispatcher
partir d'un autre thread de cours.Vous êtes en train de créer l'image bitmap (
bmp
) sur votre travailleur(?) fil, puis en le passant à le thread d'INTERFACE utilisateur - c'est ce qui ne fonctionne pas.Vous avez besoin pour créer l'image sur le thread d'INTERFACE utilisateur. Vous aurez probablement besoin d'une certaine manière de la référence à l'image que vous voulez afficher et transmettre que de l'information à l'INTERFACE utilisateur.
Vous pouvez également utiliser un mécanisme de files d'attente pour passer des messages entre les threads. Après tout, c'est la façon dont l'architecture Windows fonctionne. C'est ce que le répartiteur est en train de faire. Vous êtes de passage une référence dans le déléguer, ce qui n'est pas détenue par le WPF fil.
Donc, oui, vous avez l'idée de base, mais vous avez besoin pour passer à l'image bitmap à l'autre thread à l'aide de
Action<T>(T object)
ou dans votre cas: