具有时间间隔的Observable不会在订阅时显示结果

时间:2017-04-13 11:51:23

标签: c# system.reactive

我正在尝试为这个Observable序列添加一个时间间隔(即在特定的时间跨度产生一个整数序列),但它似乎不起作用。当我删除时间,然后它的工作时间。我错误地应用了计时器吗?

var timer = Observable.Interval(TimeSpan.FromSeconds(2)).Take(4);
var nums = Observable.Range(1,1200).Where(a => a % 2 == 0);
var sourcenumbs = timer.SelectMany(nums);


var results = sourcenumbs.Subscribe(
              x => Console.WriteLine("OnNext: {0}",x),
              ex => Console.WriteLine("OnError: {0}",ex.Message),
              () => Console.WriteLine("OnComplete")
);

此代码不显示输出,是否在到达订阅之前获取Dispose?

但是,如果我有一个带有计时器的forloop,那么它可以工作。为什么呢?

for (int i = 0; i < 10; i++)
{
     Thread.Sleep(TimeSpan.FromSeconds(0.9));
}

1 个答案:

答案 0 :(得分:0)

这是你想要的吗?

static void Main(string[] args)
{
    Execute();

    Console.ReadKey();
}

private static async void Execute()
{
    var intervals = Observable.Interval(TimeSpan.FromSeconds(2)).StartWith(0);
    var evenNumbers = Enumerable.Range(1, 1200).Where(a => a % 2 == 0);

    var evenNumbersAtIntervals = intervals.Zip(evenNumbers, (_, num) => num);

    try
    {
        await evenNumbersAtIntervals.ForEachAsync(
            x => Console.WriteLine("OnNext: {0}", x)
        );

        Console.WriteLine("Complete");
    }
    catch(Exception e)
    {
        Console.WriteLine("Exception " + e);
    }
}

请注意,数字为Enumerable而不是Observable