Répartiteur.BeginInvoke problèmes
Je suis "Une référence d'objet est requise pour la non-statique champ, une méthode ou une propriété du Système".De Windows.Le filetage.Répartiteur.BeginInvoke(Système D'.Action)'" pour ce code.
private void ResponseCompleted(IAsyncResult result)
{
HttpWebRequest request = result.AsyncState as HttpWebRequest;
HttpWebResponse response = request.EndGetResponse(result) as HttpWebResponse;
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
Dispatcher.BeginInvoke( () => {
try
{
XDocument resultsXml = XDocument.Load(sr);
QueryCompleted(new QueryCompletedEventArgs(resultsXml));
}
catch (XmlException e)
{
XDocument errorXml = new XDocument(new XElement("error", e.Message));
QueryCompleted(new QueryCompletedEventArgs(errorXml));
}
});
}
}
}
Dans le thread de l'INTERFACE utilisateur de créer un répartiteur -- Répartiteur UIDispatcher = Répartiteur.CurrentDispatcher; -- Puis au-dessus de l'appel de la méthode BeginInvoke comme ceci -- UIDispatcher.BeginInvoke(()=>... --
voir aussi.. forums.create.msdn.com/forums/p/89243/534524.aspx
voir aussi.. forums.create.msdn.com/forums/p/89243/534524.aspx
OriginalL'auteur cmaduro | 2010-04-08
Vous devez vous connecter pour publier un commentaire.
L'erreur indique que vous avez besoin d'une instance de
Dispatcher
appelerBeginInvoke
puisque c'est une méthode d'instance. Lorsque vous obtenez cette instance dépend de l'endroit où vous souhaitez envoyer un appel.Peut-être vous pouvez essayer d'utiliser la propriété statique
Dispatcher.CurrentDispatcher
pour obtenir l'instance de l'expéditeur pour le thread en cours et ensuite appelerBeginInvoke
sur cette instance. Soit ça, ou en quelque sorte un répartiteur d'instance de votre méthode de la discussion que vous souhaitez appeler.pourquoi n'est-il pas de travail?
Parce que si c'est un async rappel, c'est en cours d'exécution sur un thread du pool, pas le thread d'INTERFACE utilisateur. Donc Répartiteur.CurrentDispatcher va créer un nouveau Répartiteur pour le thread appelant, c'est à dire le thread du pool. Et donc, la invoquée code sera exécuté sur nouvellement créé Répartiteur du thread, c'est à dire le thread appelant, c'est à dire le thread du pool -- pas le thread d'INTERFACE utilisateur. (Bien sûr, mes hypothèses peuvent être mal ici.)
J'ai effectivement fini par prendre un itinéraire différent. J'ai utilisé le AsyncOperation/AsyncOperationManager le feu à la QueryCompleted événement sur le thread d'INTERFACE utilisateur. De cette façon, je n'ai pas besoin laid répartiteur de code dans mon propre viewmodel.
Si vous souhaitez utiliser le Répartiteur.CurrentDispatcher vous devez saisir une copie du thread d'INTERFACE utilisateur et de les stocker (comme sur Form_Load par exemple), alors vous pouvez appeler ce numéro de version de la propriété à partir de votre arrière-plan de threads de travail. -- Si vous prenez le Dispatacher.CurrentDispatcher de les threads d'arrière-plan directement, il sera de retour le répartiteur pour que le thread d'arrière-plan, ce qui serait inutile, puisque vous êtes déjà dans ce contexte.
OriginalL'auteur Zach Johnson
Les choses ont un peu changé depuis la dernière réponse a été posté pour cette question.
System.Windows.Threading.Dispatcher.BeginInvoke
est maintenantDeployment.Current.Dispatcher.BeginInvoke
Très utile, merci.
Déploiement: est en Silverlight
OriginalL'auteur Abhishek Oza