2010-01-12 2 views
2

J'ai une page Silverlight 3. J'utilise un System.Threading.Timer pour effectuer un appel de service WCF asynchrone. Je fais l'appel en passant la classe de page Silverlight ("this") en tant qu'objet "state" dans le constructeur du timer, et en accédant au proxy client du service. En procédant ainsi, le rappel du service WCF se déclenche correctement. Mon problème (si je comprends bien) est que le retour de l'appel WCF se produit dans un thread séparé, et donc j'obtiens une erreur d'accès lorsque je tente d'accéder/modifier les éléments de l'interface utilisateur sur la page Silverlight..net System.Threading.Timer doit accéder au composant Silverlight 3 UI dans le rappel

D'abord, est-ce que ma compréhension du problème est correcte? Deuxièmement, quelle est la méthode la plus correcte d'un point de vue architectural pour résoudre ce problème?

Nous vous remercions de votre aide.

Répondre

2

L'utilisation this.Dispatcher.BeginInvoke est nécessaire pour déplacer l'exécution de code sur le thread qui a accès à des éléments de l'interface utilisateur. Cependant, certaines idées peuvent valoir la peine d'être appliquées. Il peut être facile de le faire simplement: -

this.Dispatcher.BeginInvoke(() => { 

     // The whole body of code needed 
}); 

Cependant, il y a plusieurs choses à considérer. Si tout le code du groupe doit effectuer un travail significatif qui n'implique pas l'accès aux éléments de l'interface utilisateur, il est préférable de le faire en premier, puis de passer au thread d'interface utilisateur uniquement lorsque vous avez tout modifié pour modifier l'interface utilisateur. Cela peut signifier changer l'ordre dans lequel les choses se passent, peut-être même en employant quelques variables pour conserver les valeurs plus tard. Deuxièmement, si le même rappel est utilisé très fréquemment par le thread d'interface utilisateur, il peut être préférable de réorganiser le code, ces rappels exécutent le code directement sans l'utilisation de l'appel de fonction seondary ou BeginInvoke. La méthode Dispatchers CheckAccess peut vous aider à déterminer si BeginInvoke est nécessaire. Cependant, dans votre scénario spécifique, BeginInvoke sera toujours nécessaire.

Questions connexes