2010-03-26 8 views
0

J'ai créé mon propre service WCF et j'ai réussi à lui parler via mon client Silverlight. J'ai rencontré un problème intéressant sur mes rappels asynchrones cependant. Quand mon rappel est invoqué, je ne peux pas mettre à jour les contrôles de l'interface utilisateur avec l'accès fil de croix redoutée invalideRappel asynchrone du service WCF

Voici ce que ma fonction de rappel ressemble

private void GetTimeCallBack(object sender, Talk.ClientBase<IService>.ClientEventArgs e) 
    { 
     lblDisplay.Text = e.Object.ToString(); 
    } 

Une recherche rapide Google m'a montré que j'ai pour faire cela à la place. Maintenant, tout fonctionne correctement, mais je ne m'attendais pas à ce que mon rappel s'exécute sur un thread différent. Devrai-je toujours utiliser la classe Dispatcher pour modifier quelque chose dans ma classe ou est-ce juste limité aux éléments de l'interface utilisateur? Je ne connais pas du tout la classe Dispatcher, donc je cherche à la comprendre davantage.

Répondre

1

oui .. Consultez le link pour plus d'informations. J'ai ajouté la réponse de Joel à la question ci-dessous

Dans Silverlight 2 Beta 2 il y avait un changement significatif dans le modèle utilisé pour concurrency asynchrones communications. Dans la version bêta 1, tapez des requêtes renvoyées sur le thread d'interface utilisateur. Dans la version bêta 2, lorsque vous choisissez d'utiliser le BeginGetResponse de WebRequest, indique à Silverlight d'utiliser un thread de travail provenant d'un pool de threads . Par conséquent, vous ne pouvez pas mettre à jour des éléments d'interface utilisateur sur le thread UI . L'utilisation de Dispatcher.BeginInvoke est un moyen d'obtenir une méthode pour renvoyer sur l'UIThread à partir de ce theadpool . Toute interaction avec UIelements à partir du rappel asynchrone déclenchera une exception de thread croisé.

+0

Cool, merci. Vous n'auriez pas plus de ressources sur ce sujet par hasard le ferais-tu? – Matt

Questions connexes