2017-06-17 80 views
1

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

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

和后者

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

当我这样做InvokeCommand方法syncronly运行,只有经过GetClientsList()完成(更改为false后为true)IsExecuting观察。但变异与任务的作品:

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

它是错误吗?或在框架中的变化? PS我也试图与SubscribeOn和ObservableOn但没有戏剧帮助(((。

回答

2

Observable.Return()确实是当前线程,这意味着它的阻止。在你的情况下,当前线程是UI线程上的工作。

你可以指定一个调度,但只影响返回值,其中,不在它的出品。

我已经写Observable.Return()及其行为在this blog post

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

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

谢谢,它的工作原理。 –