如何从订阅派发PropertyChanged事件到基于时间间隔的IObservable
问题描述:
当我尝试从创建的IObservable集合的订阅中引发PropertyChanged事件时,出现'UnauthorizedAccesExpection - 无效的跨线程访问'异常通过Observable.Interval()。如何从订阅派发PropertyChanged事件到基于时间间隔的IObservable
由于我有限的线程知识,我假设间隔发生在其他线程上,而事件要发生在UI线程上?对问题的解释将非常有用。
的代码看起来有点像:
var subscriber = Observable.Interval(TimeSpan.FromSeconds(1))
.Subscribe(x =>
{
Prop = x; // setting property raises a PropertyChanged event
});
任何解决方案?
编辑:
正在从一个ViewModel不为DependencyObject执行该代码。
答
编辑:我很困惑SubscribeOn与ObserveOn。我已经更新了我的答案
你可以把你的时间间隔调度线程上解决问题:
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);
});
编辑
,因为你需要从视图模型做到这一点看到这个answer由杰夫·威尔考克斯和他的关于这个问题的优秀的博客:Property change notifications for multithreaded Silverlight applications。
这是从一个ViewModel而不是一个DependencyObject调用,所以我没有一个Dispatcher属性。 – 2010-04-07 10:51:12