2010-10-22 2 views
1

J'ai créé un modèle de vue dans Silverlight. Ce modèle de vue a un événement défini comme:Création d'un événement avec le contexte SynchronizationContext dans Silverlight

public event EventHandler Data_Loaded; 

Je souhaite "augmenter" cet événement lorsque les données d'un appel de service ont été terminées. Cela permettra à mon interface utilisateur de répondre correctement. S'il vous plaît noter, ce n'est pas simplement un scénario de liaison simple, c'est pourquoi je veux l'événement.

L'appel de service est effectué via un HttpWebRequest. Une fois cette requête effectuée, j'analyse correctement les résultats. J'essaie de faire savoir à l'interface utilisateur que j'ai terminé, mais au début, je recevais une erreur qui disait «Accès non autorisé au cross-thread». J'ai parlé à un collègue qui m'a dit que je devrais utiliser le SynchronizationContext.Current pour déclencher un événement. Malheureusement, je ne comprends pas comment faire cela. Quelqu'un peut-il me l'expliquer?

Répondre

2

Vous devez utiliser Dispatcher pour forcer l'événement à être déclenché sur le thread UI.

Deployment.Current.Dispatcher.BeginInvoke(() => DataLoaded(this,EventArgs.Empty)); 
+0

Je n'élève pas d'événement sur l'interface utilisateur. L'interface utilisateur s'abonne à un événement sur ViewModel. Si j'utilise le Dispatcher, il semble que l'interface utilisateur soit trop étroitement couplée au ViewModel. Ai-je tort? – user462166

+0

La clé du problème est que si votre interface utilisateur écoute cet événement, l'événement doit être lancé à partir du thread UI. Bien qu'il soit possible de faire avec SyncronizationContext, cela peut être très pénible car SyncronizationContext.Current sera null si vous n'êtes pas sur le thread UI. Cela signifie que vous devez obtenir le SyncronizationContext lorsque vous êtes sur le thread de l'interface utilisateur et le stocker quelque part. Ensuite, vous pouvez l'utiliser pour ramener l'appel au bon thread. En général, dans Silverlight, je ne considère pas qu'il soit étroitement couplé tant que vous utilisez Deployment et non App.RootVisual pour accéder à Dispatcher. – Stephan

Questions connexes