我使用ReactiveCommand来获取异步行为。根据{{3}}
如果您正在使用RxUI 5.0,只需使用ReactiveCommand,它们现在已合并并具有更好的API。
我有以下代码来测试它是否执行Async行为。事实证明并非如此。它会冻结用户界面5秒钟。
MyReactiveCommand.Subscribe(s =>
{
Thread.Sleep(5000);
});
我错过了什么?
答案 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是订阅实现上下文的位置。