在序列停止在Reactive UI中生成的元素后,如何获取最后一个可观察序列值?

问题描述 投票:0回答:2

当执行页面上的2个ReactiveCommands中的任何一个时,我需要在我的应用程序中禁用WPF UI。命令被一一调用。

我做了类似的观察:

IObservable<bool> CanInteractWithUserObservable => Command1.IsExecuting
                                        .CombineLatest(Command2.IsExecuting, (c1,c2)=>(c1,c2))
                                        .Select(tuple => tuple.c1 || tuple.c2)
                                        .Select(res => !res)
                                        .ObserveOn(RxApp.MainThread);

并将其绑定到Window.IsEnabled属性。

通常,它可以工作,但是当1个命令完成它的工作可观察但返回值true但第二个还没有开始的问题。因此,总体输出为:

true; //开始之前

false; //执行第一个命令

true; // 第一个命令完成,第二个尚未开始(是问题)

false; //执行第二个命令

true; //两个命令都完成了

我需要收听序列,并且仅在距离上一个真实事件大约半秒后,我才应该在我的CanInteractWithUserObservable中发布更新,以避免UI闪烁。

P.S .:可能是超时方法可能对我有帮助,但我不知道如何使用它。

c# wpf timeout reactive-programming system.reactive
2个回答
0
投票

如果我理解正确,您想等待两个事件都完成,然后释放您的UI。


-2
投票

虽然这不是一个很好的通用解决方案,但是在WPF中延迟某些内容的标准方法是使用Dispatcher.BeginInvoke(action)。它轮询Dispatcher队列上的一个异步调用,为它分配一些可配置的优先级,这使您可以延迟一些逻辑,直到线程上的当前工作完成为止。然后按顺序处理呼叫。例如,仅在所有未完成的渲染任务完成后,才可以使用它执行一些代码。 ...或者它可以用来延迟一些时间。

© www.soinside.com 2019 - 2024. All rights reserved.