2010-06-18 4 views
1

J'essaie de synchroniser les appels. Mais l'application Silverlight se verrouille lors de l'appel de la méthode endList. Dans une application de console simple, je peux effectuer une synchronisation asynchrone. Impossible de voir le problème.Appels synchrones Silverlight au wcf

var svc = new WcfServiceClient(); 
    var ar = svc.BeginList(null, null); 
    var result = svc.EndList(ar); <-- Silverlight hangs here 
    listBox.ItemsSource = result; 

Répondre

2

Silverlight ne prend pas en charge les appels de synchronisation.

Here est un article sur les appels synchrones aux services Web et une solution de contournement.

0

Réponse courte: Vous pouvez le faire si vous n'êtes pas sur le fil Dispatcher, quelque chose comme:

System.Threading.ThreadPool.QueueUserWorkItem(state => 
    { 
     IAsyncResult asyncResult = svc.BeginSomething(null, null); 

     if (!asyncResult.CompletedSynchronously) 
     { 
      asyncResult.AsyncWaitHandle.WaitOne(); 
     } 

     try 
     { 
      svc.EndSomething(asyncResult); 
     } 
     catch 
     { 
      throw; 
     } 
     finally 
     { 
      asyncResult.AsyncWaitHandle.Close(); 
     } 
    }); 

Le grand avantage est que vous pouvez garder votre couche de modèle de domaine synchroniquement comme dans les vieux jours , vous pouvez implémenter facilement le chargement paresseux etc ...

Mais en pratique, vous ne pouvez l'utiliser lorsque vous concevez votre application à respecter strictement les MVVM/commandants motifs, où vous r ViewModels et Commands gèrent la commutation entre le thread du répartiteur et les threads du modèle. Il y a beaucoup de travail à faire, et il y a des pièges, mais quand ça marche, ça marche à merveille.

Si vous souhaitez utiliser un framework prêt à l'emploi qui fonctionne de manière similaire, il est disponible ici: CodeProject: Introducing the Model Thread View Thread Pattern. L'architecture est très bien expliquée aussi sur cette page.