2010-11-03 5 views
1

J'ai un scénario assez simple:
J'ai un appel de service WCF asynchrone dans mon application Silverlight.
Je veux exécuter ceux sur un fil séparé (ou similaire) parce qu'ils gèlent mon interface utilisateur.
Tous les appels de service sont destinés à mettre à jour le ViewModel, donc le contrôle de l'interface utilisateur/a sur la page, il faut donc trouver un moyen de le faire à partir du thread exécutant les appels de service.
Des suggestions?Appelez le service WCF à partir du client Silverlight à l'aide d'un thread non-interface utilisateur

Merci beaucoup.

Répondre

0

Dispatcher.BeginInvoke est la meilleure solution.

defination partielle de proxy de service:

public void GetItemById(int id, Action<ItemModel> callback) 
{ 
    AsyncCallback onCompleted = ar => 
     Deployment.Current.Dispatcher.BeginInvoke(() => 
      callback(this.Channel.EndGetItemById(ar))); 
    this.Channel.BeginGetItemById(id, onCompleted, null); 
} 

Appel de MVVM:

var proxy = new MyServiceProxy(); 
proxy.GetItemById(5, item => this.Item = item); 
3

En parlant avec les gens de l'équipe WCF, ceci est ma compréhension sur la façon dont cela fonctionne. Si vous effectuez simplement l'appel à partir d'un thread d'arrière-plan, cela ne fonctionnera pas, car le sous-système WCF réorganisera l'appel sur le thread à partir duquel vous avez initialement ouvert la connexion (normalement, le thread UI). Donc, ce que vous avez à faire est de créer un thread de travail, puis ouvrez explicitement la connexion à partir de ce thread. Ensuite, chaque fois que vous faites un appel, il sera ramené sur ce fil. Et bien sûr, une fois que vous avez reçu votre callback et terminé votre traitement (sur le thread d'arrière-plan), assurez-vous de réorganiser les modifications de l'interface utilisateur sur le thread d'interface utilisateur à l'aide de Dispatcher.BeginInvoke().

+0

Vous venez de ma journée. J'ai eu une situation où je voulais attendre le fil de l'interface utilisateur sur un handle qui serait défini par un gestionnaire d'un achèvement d'appel WCF. Eh bien, cette fin d'appel n'est jamais venue parce que l'appel lui-même ne pouvait même pas commencer avant cette attente! – Kit

Questions connexes