CreateFromObservable是否异步工作?

时间:2017-06-17 20:04:56

标签: reactiveui

我正在尝试在WPF项目中使用ReactiveUI 7.4,我认为这是一个很棒的框架。但是在研究缺席或过时的文档时会造成很大的困难。 在文档https://docs.reactiveui.net/en/user-guide/commands/asynchronous-synchronous.html中说CreateFromObservable是异步的,但在我的例子中它是同步运行的。

zipAll<A, B>([A[], B[]]): Array<[A, B]>;
zipAll<A, B, C>([A[], B[], C[]]): Array<[A, B, C]>;
zipAll<A, B, C, D>([A[], B[], C[], D[]]): Array<[A, B, C, D]>;
zipAll<A, B, C, D, E>([A[], B[], C[], D[], E[]]): Array<[A, B, C, D, E]>;

和后者

RefreshList = ReactiveCommand.CreateFromObservable<ReactiveList<ClientDto>>(
                        () => Observable
                            .Return(_clientsService.GetClientsList())

当我执行InvokeCommand方法同步运行时,IsExecuting仅在GetClientsList()完成后观察(更改为false,之后更改为true)。但任务的变化是有效的:

   _isBusy = this.WhenAnyObservable(x => x.RefreshList.IsExecuting)
            .ToProperty(this, vm => vm.IsBusy);

是虫子吗?还是框架的变化? PS我也尝试使用SubscribeOn和ObservableOn,但没有任何帮助((。(

1 个答案:

答案 0 :(得分:2)

Observable.Return()它是否适用于当前线程,这意味着它正在阻塞。在您的情况下,当前线程是UI线程。

您可以指定一个调度程序,但这只会影响返回值的位置,而不会影响它的生成位置。

我写过Observable.Return()及其在this blog post中的行为方式。

看起来_clientsService.GetClientsList()是同步实现的。要使其异步,您可以将工作移至任务池。您已经通过在Task中运行它来完成此操作。也可以使用`Observable.Start()':

RefreshList = ReactiveCommand.CreateFromObservable<ReactiveList<ClientDto>>(
                        () => Observable
                            .Start(_clientsService.GetClientsList(), RxApp.TaskpoolScheduler);