如何使ReactiveCommand异步?(How to make ReactiveCommand

2019-10-20 09:04发布

我使用ReactiveCommand获得异步行为。 据在此讨论保罗·贝茨评论

如果您使用RxUI 5.0,只需使用ReactiveCommand,他们已经合并,并有更好的API。

我有以下代码来测试,看看它的异步行为。 它原来是不是。 它冻结了5秒钟的UI。

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

我在想什么?

Answer 1:

尝试:

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

如果你需要返回的结果:

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


Answer 2:

我用固定它TaskPoolScheduler 。 不知道这是它是如何命中注定的。

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


Answer 3:

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

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

如果你想使用多线程,则可以使用线程池,你在你的答案提供,但运行在一个线程池线程我相信这应该是订阅执行:

.SubscribeOn(RxApp.TaskPoolScheduler)

然后,如果你想要做的事UI线程需要亲和力,你需要搬回到UI线程使用:

.ObserveOn(RxApp.MainThreadScheduler)

ObserveOn是你IObserverable方法OnNext /的onComplete /的OnError上下文和SubscribeOn是在订阅实现上下文。



文章来源: How to make ReactiveCommand Async ?
标签: reactiveui