簡體   English   中英

Rx接受第一個元素,然后跳過隨后的元素一段時間

[英]Rx take first element and skip following elements for an interval of time

我嘗試每2秒訪問一次流,並在此時間內獲得第一個值。 例:

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

我嘗試了類似int 這個線程的代碼(相當類似的問題):

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

但是,這2秒不起作用,即使200毫秒后,計數器的更新速度仍然過快。

我想念什么?

使用以下代碼將數據添加到主題:

Task.Run(async () =>
            {
                while (await call.ResponseStream.MoveNext(default(CancellationToken)))
                {           
                    foreach (var result in call.ResponseStream.Current.Results)
                    {
                        subject.OnNext(result);
                    }
                }
            });

您的查詢似乎很好。 讓我們通過提供一組良好的源數據來進行測試:

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

它有一些計時器漂移,但是遵循預期的模式。 查詢有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM