And*_*ler 2 c# system.reactive reactiveui
我已经获得了一些代码来处理调度程序在其构造函数中传递给视图模型的位置.我现在想知道我是否应该使用ObserveOn(dispatcher),或者dispatcher.Invoke(...)当我想在UI线程上执行某些操作时.
例如,我可以这样做:
this.WhenAny(me => me.SomeValue, _ => Unit.Default)
.ObserveOn(dispatcher)
.Subscribe(_ => SomeMethod());
...
private void SomeMethod()
{
//do some stuff
}
Run Code Online (Sandbox Code Playgroud)
或者我可以这样做:
this.WhenAny(me => me.SomeValue, _ => Unit.Default)
.Subscribe(_ => SomeMethod());
Run Code Online (Sandbox Code Playgroud)
这意味着我可以这样做:
private void SomeMethod()
{
dispatcher.Invoke(new Action(() =>{//do some stuff});
}
Run Code Online (Sandbox Code Playgroud)
两者之间有什么重大区别吗?
我担心的是,如果我想在代码的其他部分调用SomeMethod(),这不是由SomeValue更改引发的?然后我需要做dispatcher.invoke(new Action(() => someMethod()));,这让我觉得使用dispatcher.Invoke(...)内部SomeMethod是最好的选择.
这是好事还是坏事?在那一刻,我正在均匀地使用这两种技术.我打算转到其中一个,但想先知道正确的方法.
我会看看是否可以给出一个实例,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());
Run Code Online (Sandbox Code Playgroud)
或者,应用SubscribeOn/ ObserveOnpattern来下载当前线程,执行工作,然后在原始线程上接收结果.
myRepo.GetDataFromNetwork()
.SubscribeOn(taskPoolScheduler)
.ObserveOn(dispatcherScheduler)
.Subscribe(_ => SomeMethod());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
415 次 |
| 最近记录: |