为什么如果没有订阅/Observeon,我的绑定不会更新



我正在重构一些代码。

有人可以告诉我,如果我评论这两行,我的约束力为什么我的约束力停止更新:

.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 =>

进行了更改后,您可以通过第一个订阅删除SubscribeOnObserveOn调用。

所有这些都发生了,因为反应性iObservables不在乎它们在哪个线程上。如果您的事件从背景线程开始,并且所有操作员都是同步的(他们在这里(,则将在同一线程上观察。


您布置它的方式是不可能复制的。

如果我不得不猜测,我猜想在.Render功能中抛出了一些例外,这会炸毁第一个订阅。由于没有其他订阅,因此Observable.Create的其余部分永远不会发生,因为可观察到至少有一个订阅时只能做一些事情。第二个订阅不是订阅可观察到的,它正在听副作用。

我建议您尝试从

更改第一个订阅电话
    .Subscribe();

to

    .Subscribe(item => {}, e => LogException(e));

或类似的东西。这样,您可以看到出了什么问题。

相关内容

  • 没有找到相关文章

最新更新