Wie kann ich Versand ein Property Ereignisses von einem Abonnement für ein Intervall basierend IObservable
-
25-09-2019 - |
Frage
Ich erhalte eine ‚UnauthorizedAccesExpection - Ungültige verkanten Zugang‘ Ausnahme, wenn ich versuche, ein Property Ereignis auszulösen innerhalb eines Abonnements zu einer IObservable Sammlung durch Observable.Interval erstellt ()
.Mit meinem begrenzten Threading Weiß Ich gehe davon aus, dass das Intervall auf einem anderen Thread geschieht, während das Ereignis auf dem UI-Thread passieren will ??? Eine Erklärung des Problems wäre sehr nützlich sein.
Der Code sieht ein wenig wie:
var subscriber = Observable.Interval(TimeSpan.FromSeconds(1))
.Subscribe(x =>
{
Prop = x; // setting property raises a PropertyChanged event
});
Jede Lösungen?
Edit:
Dieser Code aus einem Viewmodel nicht DependencyObject ausgeführt wird.
Lösung
Edit: Ich war verwirrend SubscribeOn mit ObserveOn. Ich habe meine Antwort aktualisiert
Sie können das Problem, indem Sie Ihr Intervall auf dem Dispatcher-Thread lösen:
var subscriber = Observable.Interval(TimeSpan.FromSeconds(1), Scheduler.Dispatcher)
.Subscribe(x =>
{
Prop = x; // setting property raises a PropertyChanged event
});
Alternativ können Sie in der Lage sein ObserveOnDispatcher
zu verwenden, aber das würde Springen Fäden verwickeln, damit ich davon abraten würde:
var subscriber = Observable.Interval(TimeSpan.FromSeconds(1))
.ObserveOnDispatcher()
.Subscribe(x =>
{
Prop = x; // setting property raises a PropertyChanged event
});
Andere Tipps
Verwendung: -
var subscriber = Observable.Interval(TimeSpan.FromSeconds(1))
.Subscribe(x =>
{
Dispatcher.BeginInvoke(() => Prop = x);
});
Bearbeiten
Da Sie dies aus dem Viewmodel tun müssen, finden Sie in dieser Antwort von Jeff Wilcox und sein ausgezeichneter Blog zum Thema: Property Änderungsbenachrichtigungen für multithreaded Silverlight-Anwendungen .