Comment puis-je envoyer un événement PropertyChanged d'un abonnement à un intervalle IObservable basé
-
25-09-2019 - |
Question
Je reçois un « UnauthorizedAccesExpection - l'accès inter-fil non valide » exception lorsque je tente de soulever un événement PropertyChanged à partir d'un abonnement à une collection IObservable créée par Observable.Interval ()
.Avec ma connaissance de filetage limité Je suppose que l'intervalle se passe sur un autre thread alors que l'événement veut se passer sur le thread d'interface utilisateur ??? Une explication du problème serait très utile.
Le code ressemble un peu:
var subscriber = Observable.Interval(TimeSpan.FromSeconds(1))
.Subscribe(x =>
{
Prop = x; // setting property raises a PropertyChanged event
});
Les solutions?
Edit:
Ce code est en cours d'exécution d'un ViewModel pas DependencyObject.
La solution
Modifier Je confondais avec SubscribeOn ObserveOn. J'ai mis à jour ma réponse
Vous pouvez résoudre votre problème en mettant votre intervalle sur le fil répartiteur:
var subscriber = Observable.Interval(TimeSpan.FromSeconds(1), Scheduler.Dispatcher)
.Subscribe(x =>
{
Prop = x; // setting property raises a PropertyChanged event
});
Vous pourriez être en mesure d'utiliser ObserveOnDispatcher
mais qui impliquerait des fils sauter alors je vous recommande contre:
var subscriber = Observable.Interval(TimeSpan.FromSeconds(1))
.ObserveOnDispatcher()
.Subscribe(x =>
{
Prop = x; // setting property raises a PropertyChanged event
});
Autres conseils
Utilisation: -
var subscriber = Observable.Interval(TimeSpan.FromSeconds(1))
.Subscribe(x =>
{
Dispatcher.BeginInvoke(() => Prop = x);
});
Modifier
Puisque vous devez faire du ViewModel voir cette répondre par Jeff Wilcox et son excellent blog sur le sujet: notifications de modification de la propriété pour les applications Silverlight multithread .