2017-06-17 84 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

謝謝,它的工作原理。 –