如何使ReactiveCommand异步?

时间:2014-07-04 08:27:39

标签: reactiveui

我使用ReactiveCommand来获取异步行为。根据{{​​3}}

  

如果您正在使用RxUI 5.0,只需使用ReactiveCommand,它们现在已合并并具有更好的API。

我有以下代码来测试它是否执行Async行为。事实证明并非如此。它会冻结用户界面5秒钟。

MyReactiveCommand.Subscribe(s =>
{   
    Thread.Sleep(5000);
});

我错过了什么?

3 个答案:

答案 0 :(得分:4)

尝试:

MyReactiveCommand
.RegisterAsyncAction(_ =>
                         {
                           Thread.Sleep(5000);
                         });

如果您需要返回结果:

MyReactiveCommand
.RegisterAsyncFunction(o =>
                          {   
                            Thread.Sleep(5000);
                            return o.ToString();
                          })
.Subscribe(s => MessageBox.Show(string.Format("{0} was returned", s)));

答案 1 :(得分:0)

我使用TaskPoolScheduler修复了它。不确定这是不是它的意思。

MyReactiveCommand
.ObserveOn(RxApp.TaskPoolScheduler)
.Subscribe(s =>
{   
    Thread.Sleep(5000);
});

答案 2 :(得分:0)

我是ReactiveUI的新手,但我相信异步而不冻结UI是不同的问题。异步可能发生在1个线程上,即它不等待某些结果,但可以继续处理其他事情。我想如果你让线程睡眠而你只有1个线程,那么它将无法做任何其他的工作。

像Task.Delay这样的东西,我相信会让你等一段时间而不会阻塞线程。

如果你想使用多个线程,你可以使用你在答案中提供的线程池,但是为了在线程池线程上运行订阅实现,我认为它应该是:

.SubscribeOn(RxApp.TaskPoolScheduler)

然后,如果您想对需要线程关联的UI执行某些操作,则需要使用以下命令返回到UI线程:

.ObserveOn(RxApp.MainThreadScheduler)

ObserveOn是您的IObserverable方法OnNext / OnComplete / OnError上下文的位置,而SubscribeOn是订阅实现上下文的位置。