我使用ReactiveCommand获得异步行为。 据在此讨论保罗·贝茨评论
如果您使用RxUI 5.0,只需使用ReactiveCommand,他们已经合并,并有更好的API。
我有以下代码来测试,看看它的异步行为。 它原来是不是。 它冻结了5秒钟的UI。
MyReactiveCommand.Subscribe(s =>
{
Thread.Sleep(5000);
});
我在想什么?
我使用ReactiveCommand获得异步行为。 据在此讨论保罗·贝茨评论
如果您使用RxUI 5.0,只需使用ReactiveCommand,他们已经合并,并有更好的API。
我有以下代码来测试,看看它的异步行为。 它原来是不是。 它冻结了5秒钟的UI。
MyReactiveCommand.Subscribe(s =>
{
Thread.Sleep(5000);
});
我在想什么?
尝试:
MyReactiveCommand
.RegisterAsyncAction(_ =>
{
Thread.Sleep(5000);
});
如果你需要返回的结果:
MyReactiveCommand
.RegisterAsyncFunction(o =>
{
Thread.Sleep(5000);
return o.ToString();
})
.Subscribe(s => MessageBox.Show(string.Format("{0} was returned", s)));
我用固定它TaskPoolScheduler
。 不知道这是它是如何命中注定的。
MyReactiveCommand
.ObserveOn(RxApp.TaskPoolScheduler)
.Subscribe(s =>
{
Thread.Sleep(5000);
});
我是新来ReactiveUI,但我相信异步,而不是冻结UI是不同的问题。 异步可能发生在1个线程,也就是说,它不会等待了一些成绩,但可以继续处理其他事情。 我想,如果你让线程睡眠,你只有1个线程,那么将无法做任何其他工作。
像Task.Delay东西,我相信会让你等待一段时间,而不会阻塞线程。
如果你想使用多线程,则可以使用线程池,你在你的答案提供,但运行在一个线程池线程我相信这应该是订阅执行:
.SubscribeOn(RxApp.TaskPoolScheduler)
然后,如果你想要做的事UI线程需要亲和力,你需要搬回到UI线程使用:
.ObserveOn(RxApp.MainThreadScheduler)
ObserveOn是你IObserverable方法OnNext /的onComplete /的OnError上下文和SubscribeOn是在订阅实现上下文。