我正在尝试在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,但没有任何帮助((。(
答案 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);