La compréhension de l'Silverlight Répartiteur
J'ai eu un Invalide de la Croix-Thread problème d'accès, mais un peu de recherche et j'ai réussi à le résoudre en utilisant le Répartiteur.
Maintenant, dans mon application j'ai des objets avec un chargement différé. Je voudrais faire un appel Asynchrone en utilisant WCF et comme d'habitude j'ai utiliser le Répartiteur de mettre à jour mes objets DataContext, mais il ne fonctionne pas pour ce scénario. J'ai cependant trouvé une solution ici. Voici ce que je ne comprends pas.
Dans mon UserControl j'ai le code pour appeler un Bascule méthode sur mon objet. L'appel de cette méthode est à l'intérieur d'un Répartiteur comme si.
Dispatcher.BeginInvoke( () => _CurrentPin.ToggleInfoPanel() );
Comme je l'ai mentionné avant, ce n'était pas suffisant pour satisfaire Silverlight. J'ai eu à faire un autre Répartiteur d'appel à l'intérieur de mon objet. Mon objet est PAS UIElement, mais d'une simple classe qui gère l'ensemble de son propre chargement/sauvegarde.
De sorte que le problème a été résolu en appelant
Deployment.Current.Dispatcher.BeginInvoke( () => dataContext.Detail = detail );
au sein de ma classe.
Pourquoi dois-je appeler le Répartiteur à deux reprises pour atteindre cette? Ne faut-il pas de haut niveau de l'appel suffit? Est-il une différence entre le de Déploiement.Actuel.Répartiteur et le Dispatcher dans un UIElement?
- Je ne pense pas que vous avez fourni assez de code. Je soupçonne quelque chose que vous faites est de tirer un appel du réseau, qui est de retour dans un thread d'arrière-plan, d'où les deux invoque?
Vous devez vous connecter pour publier un commentaire.
Idéalement, stocker une instance unique de
Dispatcher
que vous pouvez utiliser ailleurs sans avoir le thread vérifier sur elle.De l'appel à tout singleton .Instance actuelle peut en effet provoquer un cross-thread de contrôle d'accès doit être invoquée. En les stockant tout d'abord, vous pouvez éviter cela en fait pour obtenir l'instance partagée.
- Je utiliser un "SmartDispatcher" qui utilise un régulateur lorsqu'appelle le fil, et juste appelle autrement. Il permet de résoudre ce type de problème.
Post: http://www.jeff.wilcox.name/2010/04/propertychangedbase-crossthread/
Code:
Si vous utilisez le MVVM light toolkit vous pouvez utiliser le DispatcherHelper classe dans le Galasoft.MvvmLight.Le filetage de l'espace de noms dans les Extras dll. Il vérifie l'accès et utilise une propriété statique pour le répartiteur, semblable à la SmartDispatcher.
Dans votre Application.xaml.cs événement de démarrage appel:
Puis n'importe où vous avez besoin d'utiliser un répartiteur d'utilisation: