我正在重构一些代码。
有人可以告诉我,如果我评论这两行,我的约束力为什么我的约束力停止更新:
.SubscribeOn(ThreadPoolScheduler.Instance)
.ObserveOn(Application.Current.Dispatcher)
它如何影响第二个订阅?
RendererService.WhenRenderProgress.Subscribe
我的目标是删除包装器可观察的。
谢谢!
public class RendererService
{
public Subject<int> WhenRenderProgress = new Subject<int>();
public void Render()
{
Observable.Create<Unit>(observer =>
{
for (var i = 0; i < 100; i++)
{
WhenRenderProgress.OnNext(i);
}
observer.OnCompleted();
return Disposable.Empty;
})
.SubscribeOn(ThreadPoolScheduler.Instance)
.ObserveOn(Application.Current.Dispatcher)
.Subscribe();
}
}
public class ViewModel: Screen, IViewModel, IDisposable
{
public int Progress { get; set; }
public ViewModel(RendererService RendererService)
{
RendererService.WhenRenderProgress.Subscribe(i =>
{
Progress = i;
NotifyOfPropertyChange(() => Progress);
});
}
}
编辑:
对不起,您的评论很有意义。这是由于WPF线程要求。第二个订阅必须在UI线程上发生。发生这种情况的最好方法是更改此行...
RendererService.WhenRenderProgress.Subscribe(i =>
对此...
RendererService.WhenRenderProgress.ObserveOn(Application.Current.Dispatcher).Subscribe(i =>
进行了更改后,您可以通过第一个订阅删除SubscribeOn
和ObserveOn
调用。
所有这些都发生了,因为反应性iObservables不在乎它们在哪个线程上。如果您的事件从背景线程开始,并且所有操作员都是同步的(他们在这里(,则将在同一线程上观察。
您布置它的方式是不可能复制的。
如果我不得不猜测,我猜想在.Render
功能中抛出了一些例外,这会炸毁第一个订阅。由于没有其他订阅,因此Observable.Create
的其余部分永远不会发生,因为可观察到至少有一个订阅时只能做一些事情。第二个订阅不是订阅可观察到的,它正在听副作用。
我建议您尝试从
更改第一个订阅电话 .Subscribe();
to
.Subscribe(item => {}, e => LogException(e));
或类似的东西。这样,您可以看到出了什么问题。