我开始使用反应式扩展(版本2.1,以防万一)进行开发,对于我的示例应用程序,我需要一系列按某些间隔推送的int值,即每1秒。如何使用Rx(反应性扩展)粘贴相对延迟
我知道,我可以用Observable.Range<int>(0,10)
创建一个序列,但我无法弄清楚如何设置推送之间的相对时间。我试过Delay()
,但是在开始时只将序列移动一次。
我随后发现Observable.Generate()
方法,可以进行调整,以在明年方式这一任务:
var delayed = Observable.
Generate(0, i => i <= 10, i => i + 1, i => i,
i => TimeSpan.FromSeconds(1));
不过,这似乎是“换每个般”的定义序列的简单唯一的工作。 所以,一般来说,我的问题是,我们是否可以获得任何源序列,并用一些代理来包装它,这些代理将从源中获取消息并延时推进?
S--d1--d2--d3--d4--d5-|
D--d1-delay-d2-delay-d3-delay-d4-delay-d5-|
P.S.如果这种方法与ReactiveExtensions的概念相矛盾,请注意这一点。我不想“无论如何”这样做,他们将来也会遇到其他一些设计问题。
P.P.S总体思路是,以确保输出序列具有事件尽管如果输入序列是有限的还是无限的,以及它推动事件之间指定的时间间隔。
感谢您的回答。 Zip()的破解工作几乎没有问题。这里的一个缺陷是,如果“输入”序列在时间上是无限且不可预知的(即发生按钮点击)。有了它,如果按钮没有被点击 - 比如说10秒 - “输入”中没有事件,但是“计时器”序列产生了10个事件。然后,如果我开始快速点击按钮,所有来自'输入'的新事件都会与来自'timer'的现有事件成对压缩,因此'结果'序列也将以'输入'的推送速度拉动,这不是我想。 – Antonio
我会在'timer'中添加如下检查:_on新事件't_i',检查'input'中是否有事件,如果没有't_i',则检查't_i'。 – Antonio
关于点击一个按钮的位是所有新闻给我:)这不是在你的问题。也许你可以纯粹根据涉及的实际数据和期望的用户体验来重新说明问题? –