C# 为什么我的绑定在没有SubscribeOn/ObserveOn的情况下无法更新?

C# 为什么我的绑定在没有SubscribeOn/ObserveOn的情况下无法更新?,c#,wpf,system.reactive,caliburn.micro,C#,Wpf,System.reactive,Caliburn.micro,我正在重构一些代码 有人能告诉我,如果我注释掉这两行,为什么viewModel中的绑定会停止更新: .SubscribeOn(ThreadPoolScheduler.Instance) .ObserveOn(Application.Current.Dispatcher) 它如何影响第二次订阅 RendererService.WhenRenderProgress.Subscribe 我的目标是删除包装器Observable.Create(Observator…),但当我注释掉它时,即使主题发出

我正在重构一些代码

有人能告诉我,如果我注释掉这两行,为什么viewModel中的绑定会停止更新:

.SubscribeOn(ThreadPoolScheduler.Instance)
.ObserveOn(Application.Current.Dispatcher)
它如何影响第二次订阅

RendererService.WhenRenderProgress.Subscribe
我的目标是删除包装器Observable.Create(Observator…),但当我注释掉它时,即使主题发出值,viewModel也不会呈现它们

谢谢大家!

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);
        });
    }
}
公共类呈现器服务
{
public Subject whenredprogress=新主题();
公共无效呈现()
{
可观察的。创建(观察者=>
{
对于(变量i=0;i<100;i++)
{
当进展缓慢时。OnNext(i);
}
observer.OnCompleted();
返回一次性。空;
})
.SubscribeOn(ThreadPoolScheduler.Instance)
.ObserveOn(Application.Current.Dispatcher)
.Subscribe();
}
}
公共类视图模型:屏幕、IViewModel、IDisposable
{
公共int进程{get;set;}
公共视图模型(渲染器服务渲染器服务)
{
RenderService.WhenRenderProgress.Subscribe(i=>
{
进展=i;
通知财产变更(()=>进度);
});
}
}
编辑:

很抱歉,您的评论有意义。这是由于WPF线程要求。第二次订阅必须在UI线程上进行。最好的方法是更改此行

    RendererService.WhenRenderProgress.Subscribe(i =>
对此

    RendererService.WhenRenderProgress.ObserveOn(Application.Current.Dispatcher).Subscribe(i =>
进行更改后,您可以通过第一次订阅删除
SubscribeOn
ObserveOn
调用

所有这些都是因为被动IObservables不关心在哪个线程上观察到它们。如果事件在后台线程上启动,并且所有操作符都是同步的(它们在这里),那么它将在同一个线程上观察到


按照你的安排,这是不可能复制的

如果让我猜的话,我会猜在
.Render
函数中抛出了一些异常,这会破坏第一个订阅。因为没有其他订阅,所以
可观察的.Create
的其余部分永远不会发生,因为可观察的部分只在至少有一个订阅时才起作用。第二个订阅没有订阅产生可观察的,它正在收听一个副作用

我建议您尝试将第一个订阅呼叫从

    .Subscribe();


或者类似的东西。这样你就可以看到哪里出了问题。

我设置了一个断点,两种情况都遇到了NotifyOfPropertyChange(()=>Progress);这只是一个场景更新UI,而另一个场景不更新UI。我想知道UI线程与后台线程是否相关。我不掌握WPF enought.Yes。更新的答案。嗯…在从第一个订阅中删除SubscribeOn和ObserveOn,然后添加.ObserveOn之后,令人惊讶(Application.Current.Dispatcher)在第二个订阅上,我在第二个订阅中的断点停止命中,而我在OnNext(i)hitHum上的断点……我重构的代码在一个巨大的异步函数中。这会影响反应式.NET行为吗?
    .Subscribe(item => {}, e => LogException(e));