如果我正确理解您的需求,则此方法有效:
var notification = _sensor.Publish(ps => ps
.Select(x => x >= 15.0)
.DistinctUntilChanged()
.Select(p => p
? Observable.Empty<double>()
: Observable
.Timer(TimeSpan.FromMinutes(1.0))
.Select(x => -1.0)
.IgnoreElements()
.Concat(ps))
.Switch());
我假设这_sensor
是一个IObservable<double>
.
_sensor
因此,只要这些值保持在 15.0 以下至少一分钟,这个 observable 就会发布流中的所有值。我已经测试了这个功能。
我的测试代码是:
var random = new Random();
var _sensor = Observable.Generate(
0,
x => true,
x => x,
x => random.NextDouble() * 16.0,
x => TimeSpan.FromSeconds(random.NextDouble()));
var published_sensor = _sensor.Publish();
var notification = published_sensor.Publish(ps => ps
.Select(x => x >= 15.0)
.DistinctUntilChanged()
.Select(p => p
? Observable.Empty<double>()
: Observable
.Timer(TimeSpan.FromSeconds(5.0))
.Select(x => -1.0)
.IgnoreElements()
.Concat(ps))
.Switch());
published_sensor.Merge(notification).Timestamp().Dump();
published_sensor.Connect();
我得到的结果是:

请注意,在发布重复值之前会经过 5 秒,并且当源产生超过 15 的值时重复停止。