CreateFromObservable 是否异步工作?

Does CreateFromObservable works asynchrony?

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

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

及后者

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

当我执行 InvokeCommand 方法时 运行s syncronly,并且 IsExecuting 仅在 GetClientsList() 完成后观察(更改为 false,之后更改为 true)。但是变体与任务一起工作:

RefreshList = ReactiveCommand.CreateFromTask(async _ =>
            {
                return await Task.Run(() => _clientsService.GetClientsList());
            }
        );

是bug吗?还是框架的变化? PS 我也尝试玩 SubscribeOn 和 ObservableOn 但没有任何帮助 (((.

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

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

我写过关于 Observable.Return() 及其在 this blog post 中的表现。

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

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