Как я могу отправить недвижимое событие от подписки на интервал на основе IBServable
-
25-09-2019 - |
Вопрос
Я получаю «несанкционированную клавишу» - неверный исключений доступа к перекрестным потокам, когда я пытаюсь поднять недвижимое событие, изнутри подписку на iBservable Collection, созданную через наблюдаемый.
С моим ограниченным потоковым знанием я предполагаю, что интервал происходит на каком-то другом потоке, пока событие хочет случиться на теме UI ??? Объяснение проблемы было бы очень полезным.
Код выглядит немного похоже на:
var subscriber = Observable.Interval(TimeSpan.FromSeconds(1))
.Subscribe(x =>
{
Prop = x; // setting property raises a PropertyChanged event
});
Любые решения?
Редактировать:
Этот код выполняется из ViewModel, а не зависитностьобекты.
Решение
Редактировать: Я был запутанным подписчиком с наблюдателем. Я обновил свой ответ
Вы можете решить вашу проблему, поместив свой интервал на резьбу диспетчера:
var subscriber = Observable.Interval(TimeSpan.FromSeconds(1), Scheduler.Dispatcher)
.Subscribe(x =>
{
Prop = x; // setting property raises a PropertyChanged event
});
В качестве альтернативы вы могли бы использовать ObserveOnDispatcher
Но это будет включать в себя прыжки, поэтому я бы порекомендовал против него:
var subscriber = Observable.Interval(TimeSpan.FromSeconds(1))
.ObserveOnDispatcher()
.Subscribe(x =>
{
Prop = x; // setting property raises a PropertyChanged event
});
Другие советы
Использовать:-
var subscriber = Observable.Interval(TimeSpan.FromSeconds(1))
.Subscribe(x =>
{
Dispatcher.BeginInvoke(() => Prop = x);
});
Редактировать
Поскольку вам нужно сделать это с ViewModel, см. отвечать Джефф Уилкос и его отличный блог на теме: Уведомления об изменении свойств для многопоточных приложений Silverlight.