【问题标题】:Observable.Generate Delays resultsObservable.Generate 延迟结果
【发布时间】:2014-11-15 02:55:41
【问题描述】:

以下代码将结果延迟 2 秒。我想要的是立即返回结果,但每 2 秒启动一个新的 observable。我错过了什么?

输出:

**The current output is:**
05: 1. Run
07 Result: 1

07: 2. Run
09 Result: 2

09: 3. Run
11 Result: 3


**Desired output is:**
05: 1. Run
05 Result: 1

07: 2. Run
07 Result: 2

09: 3. Run
09 Result: 3

代码:

    var sources = Enumerable.Range(1, 8).Select(i =>
                                                {
                                                    Console.WriteLine("{0}: {1}. Run", DateTimeOffset.Now.ToString("ss"), i);

                                                    return Observable.Return(i, CurrentThreadScheduler.Instance);
                                                });

    Observable.Generate(sources.GetEnumerator(), e => e.MoveNext(), e => e, e => e.Current, e => TimeSpan.FromMilliseconds(2000), ThreadPoolScheduler.Instance)
              .Merge()
              .Timestamp()
              .Do(r =>
                  {
                      Console.WriteLine("{0} Result: {1}{2}", r.Timestamp.ToString("ss"), r.Value, Environment.NewLine);
                  },
                  ex =>
                  {
                      Console.WriteLine(ex.ToString());
                  },
                  () =>
                  {
                      Console.WriteLine("Completed");
                  })
              .Subscribe();

【问题讨论】:

  • 真的不清楚你在这里追求什么 - 我认为你对保罗的回答的评论意味着你想要可变的数据驱动间隔,但除此之外(对我训练有素的 Rx 眼)还有很多代码中的“奇怪的东西”。也许用非 rx 术语解释您要实现的目标会很有用。例如,不清楚为什么要为sources 创建IEnumerable<IObservable>,因为看起来IEnumerable<> 会这样做。也不清楚sources 是否应该包含指示所需间隔的数据。

标签: c# system.reactive scheduler observable


【解决方案1】:

怎么样:

Observable.Interval(TimeSpan.Zero, TimeSpan.FromSeconds(2.0))
    .SelectMany(_ => GenerateAnObservable())
    .Subscribe(/* ... */);

【讨论】:

  • 我在每个循环中使用 generate 作为可变周期选择器。
【解决方案2】:

用这个替换你当前的Observable.Generate怎么样:

Observable
    .Generate(
        0,
        i => true,
        i => i + 1,
        i => i,
        i => TimeSpan.FromMilliseconds(i == 0 ? 0 : 2000),
        ThreadPoolScheduler.Instance)
    .Zip(sources, (g, s) => s)

我得到了这个结果:

41: 1. Run
41 Result: 1

43: 2. Run
43 Result: 2

45: 3. Run
45 Result: 3

47: 4. Run
47 Result: 4

49: 5. Run
49 Result: 5

51: 6. Run
51 Result: 6

53: 7. Run
53 Result: 7

55: 8. Run
55 Result: 8

Completed

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2010-11-02
    相关资源
    最近更新 更多