То, чего я хочу достичь, можно описать следующим образом:
- У меня есть поток выборок, которые представляют собой значения измерений с отметками времени. Это сырой поток.
- Я применяю фильтр к необработанному потоку, в результате чего получаю производный поток (это будет фильтр гистерезиса из этот вопрос, но для простоты я использую здесь оператор
Where
) - Чтобы устранить большие пробелы, возникающие из-за медленного изменения значений, я применяю оператор
Sample
к необработанному потоку. - Я объединяю оба потока в результирующий поток
Концепция выглядит так:
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
var s = Observable.Interval(TimeSpan.FromMilliseconds(100)).Publish().AutoConnect();
var s1 = s.Where(x => x % 5 == 0);
var s2 = s.Sample(TimeSpan.FromMilliseconds(1000));
new[] {s1, s2}.Merge()./*Distinct().*/Subscribe(Console.WriteLine, cts.Token);
await Task.Delay(Timeout.InfiniteTimeSpan, cts.Token).ContinueWith(_=>_, TaskContinuationOptions.OnlyOnCanceled);
Первоисточник горячий. Без Distinct
я, очевидно, получаю повторяющиеся значения, с ним, похоже, получается то, что я ожидаю увидеть.
Есть ли лучший подход, учитывая тот факт, что первый производный поток не является периодическим?