【问题标题】:Reactive - Combining Observable Interval with manual triggers反应式 - 将 Observable Interval 与手动触发相结合
【发布时间】:2016-09-05 01:20:44
【问题描述】:

我有Observable.Interval(TimeSpan.FromSeconds(1)) 和一个订阅者,它在每个时间间隔发生时检查数据库中的某些内容。但有时当我从数据库进行检查时,我想立即执行另一次检查(再次调用该订阅者,因为我知道队列中有东西)。

我已经通过在订阅者方法中将 Interval 与 while 结合起来实现了类似的效果:

 Observable              
.Interval(TimeSpan.FromSeconds(1))
.Sample(TimeSpan.FromSeconds(1)) //to avoid multiple 'stacked' intervals 
.Subscribe(RepeatAction);


private void RepeatAction(long _)
{
    bool wasSuccess;
    do
    {
        wasSuccess = CheckingInDB(); //Long operation
    } while (wasSuccess );
}

但是有没有可能用 pure 响应式来实现这种行为?

【问题讨论】:

  • SubscribeInContext 方法是什么?哪里来的?

标签: c# system.reactive observable


【解决方案1】:

是的。这是可能的。

首先,您对 Rx 存在误解。

如果你运行这段代码:

void Main()
{
    Observable
        .Interval(TimeSpan.FromSeconds(1.0))
        .Sample(TimeSpan.FromSeconds(1.0))
        .Timestamp()
        .Subscribe(RepeatAction);
}

private void RepeatAction(Timestamped<long> _)
{
    Console.WriteLine(_.Timestamp);
    Thread.Sleep(10000);
}

你会得到这个结果:

2016/05/11 10:37:57 +00:00
2016/05/11 10:38:07 +00:00
2016/05/11 10:38:17 +00:00
2016/05/11 10:38:27 +00:00

您会看到生成的每个值之间的步长是 10 秒,而不是 1。Interval 运算符只是确保每个值之间的间隔至少是 @ 的持续时间987654324@,但如果观察者花费更长的时间,则持续时间将与每个订阅者花费的时间一样长。它不会将值排队。

另一种看待它的方式是 .Sample(TimeSpan.FromSeconds(1)) 什么都不做,因为 .Interval(TimeSpan.FromSeconds(1.0)) 确保值之间的最小差距已经是 1 秒。

现在,使用纯 Rx 运算符来解决问题。试试这个:

var query =
    Observable
        .Interval(TimeSpan.FromSeconds(1.0))
        .Select(_ =>
            Observable
                .While(
                    () => CheckingInDB(),
                    Observable.Return(Unit.Default)))
        .Switch();

这将尝试每秒检查一次数据库,但一旦它达到一个值,它会迅速重复检查,直到它没有。然后等待 1 秒再试一次。

【讨论】:

  • 感谢您的回答,这听起来合乎逻辑,但我无法让它发挥作用。它从不触发 CheckingInDb()。有什么想法吗?
  • @Knopo - 我刚刚通过按原样复制并粘贴到我的开发环境中测试了我的查询,它按预期调用CheckingInDB 工作正常。试着做一个非常简单的CheckingInDB 看看会发生什么?我的是public bool CheckingInDB() { Console.WriteLine("!"); return true; }
  • @Knopo - 你确实订阅了 observable,对吧?
  • 我没有订阅 observable。现在它就像一个魅力。非常感谢您的全面回复 - 您对我帮助很大。
猜你喜欢
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
相关资源
最近更新 更多