代码之家  ›  专栏  ›  技术社区  ›  Tobias von Falkenhayn

接收第一个元素并在一段时间内跳过后面的元素

  •  0
  • Tobias von Falkenhayn  · 技术社区  · 6 年前

    我尝试每2秒访问一个流,并在此时间内获取第一个值。 例子:

    Values: -1--2-3---4-----5--6-7--8
    Result: -1-------3--------5------
    

    我试过类似int的代码 this thread (相当类似的问题):

    subject.AsObservable().Window(TimeSpan.FromSeconds(2))
                .SelectMany(f => f.Take(1))
                .Subscribe(f =>
            {
                Console.WriteLine("Counter: " + counter + " Time:" + DateTime.Now.Millisecond);
                counter++;
            });
    

    我错过了什么?

    Task.Run(async () =>
                {
                    while (await call.ResponseStream.MoveNext(default(CancellationToken)))
                    {           
                        foreach (var result in call.ResponseStream.Current.Results)
                        {
                            subject.OnNext(result);
                        }
                    }
                });
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Enigmativity    6 年前

    你的问题似乎很好。让我们通过给它一组好的源数据来测试它:

    var rnd = new Random();
    var source =
        Observable
            .Generate(0, x => true, x => x + 1, x => x,
                x => TimeSpan.FromSeconds(rnd.NextDouble() / 10.0));
    

    这将每隔0.0到100.0毫秒产生一个值。因此,如果查询是正确的,我们应该期望看到在每个2,0秒窗口的100毫秒内产生一个值(给出或接受Windows操作系统计时问题)。

    var sw = Stopwatch.StartNew();
    source
        .Window(TimeSpan.FromSeconds(2.0))
        .SelectMany(f => f.Take(1))
        .Subscribe(f =>
        {
            Console.WriteLine($"Counter: {f} Time: {sw.Elapsed.TotalMilliseconds}");
        });
    

    我得到的结果是:

    Counter: 0 Time: 110.8073
    Counter: 33 Time: 2124.7605
    Counter: 67 Time: 4061.8636
    Counter: 101 Time: 6061.1922
    Counter: 134 Time: 8090.158
    Counter: 169 Time: 10173.0396
    Counter: 197 Time: 12153.0229
    Counter: 233 Time: 14138.7718
    Counter: 265 Time: 16144.8861
    Counter: 296 Time: 18122.042
    Counter: 337 Time: 20141.1837
    Counter: 373 Time: 22115.0944
    Counter: 410 Time: 24162.0706