我应该使用dispatcher. invoke(..)还是ObserveOn(dispatcher) ?

本文关键字:dispatcher 还是 ObserveOn invoke 我应该 | 更新日期: 2023-09-27 18:14:25

我已经得到了一些代码来处理分派器在其构造函数中传递给视图模型的位置。我现在想知道我是否应该使用ObserveOn(dispatcher),或dispatcher.Invoke(...)当我想在UI线程上执行的东西。

例如,我可以这样做:

this.WhenAny(me => me.SomeValue, _ => Unit.Default)
.ObserveOn(dispatcher)
.Subscribe(_ => SomeMethod());
...
private void SomeMethod()
{
    //do some stuff
}

或者我可以这样做:

this.WhenAny(me => me.SomeValue, _ => Unit.Default)
.Subscribe(_ => SomeMethod());

这就意味着我可以这样做:

private void SomeMethod()
{
    dispatcher.Invoke(new Action(() =>{//do some stuff});
}

两者有什么主要区别吗?

我关心的是,如果我想在代码的其他部分调用someemethod(),这不是由someevalue改变触发的?然后我需要做dispatcher.invoke(new Action(() => someMethod()));,这使我认为在someemethod内使用dispatcher.Invoke(...)是最好的选择。

这一步棋是好是坏?现在这两种方法我都用得很均匀。我打算切换到其中一个,但想先知道正确的方法

我应该使用dispatcher. invoke(..)还是ObserveOn(dispatcher) ?

我会看看我是否可以给出IScheduler的实例,这是DispatcherScheduler的实现。这样,我就可以用TestScheduler测试我的代码,而不必进入分派器的内部并推送帧等。一旦你有了IScheduler的实例,你就可以把它用在ObserveOn(dispatcherScheduler)上。

我也同意@mclaassen的观点,你应该知道你在哪个调度器/线程上,因此你是否应该需要调度器/调用。例如,如果您正在观察INotifyPropertyChanged事件,那么您将在调度程序上,因此不需要调度。如果您正在接收来自网络调用或繁重计算的响应,那么您可能在另一个线程上,因此您应该调度/调度以返回到调度程序。

的成本

Rx的标准模式是:要么不调度,因为你已经在正确的线程上了:

//this is a ViewModel, and property changes occur on the dispatcher
this.WhenAny(
    vm => vm.PropertyA, 
    vm => vm.PropertyB, 
    _ => Unit.Default)
.Subscribe(_ => SomeMethod());

或者,应用SubscribeOn/ObserveOn模式来脱离当前线程,执行工作,然后在原始线程上接收结果。

myRepo.GetDataFromNetwork()
    .SubscribeOn(taskPoolScheduler)
    .ObserveOn(dispatcherScheduler)
    .Subscribe(_ => SomeMethod());

功能上没有区别。然而,我会使用ObserveOn(dispatcher),并留下SomeMethod(),因为它是。您也可能稍后从UI线程调用SomeMethod(),在这种情况下,调度将是不必要的。我想说,调用代码应该负责知道它是否在UI线程上运行,因此是否需要调度。