我有一个项目,我需要每 10 秒发送一次状态消息,除非同时有更新。意思是,每次有更新时,计时器都会重置。
var res = Observable
.Interval(TimeSpan.FromSeconds(10))
.Where(_ => condition);
res.Subscribe(_ => Console.WriteLine("Status sent."));
现在我知道“Where”只会在计时器结束时应用,所以它没有帮助。但是,我想知道是否有办法重置间隔;或使用带重复的 Timer()。
最佳答案
使用标准 Rx 运算符很容易实现。
从您的问题中不清楚的是“更新”到底是什么。我将假设您有某种针对每次更新都会触发的可观察对象,或者您可以创建一个主题,您将称之为 .OnNext(...)
。当有更新时。如果没有可观察到的更新,则很难知道何时重置计时器。
代码如下:
var update = new Subject<bool>();
var res =
update
.Select(x => Observable.Interval(TimeSpan.FromSeconds(10.0)))
.Switch();
res
.Subscribe(_ => Console.WriteLine("Status sent."));
update.OnNext(true);
res
查询现在等待直到它从 update
中获取值然后它选择一个新的 Observable.Interval
.这意味着在 Select
之后类型是 IObservable<IObservable<long>>
, 所以 .Switch()
需要将其转换为 IObservable<long>
. .Switch()
通过仅传递最新观察到的可观察对象的值并处理任何先前的可观察对象来做到这一点。换句话说,对于每个 update
启动一个新的计时器,并取消以前的计时器。这意味着如果您的更新发生频率超过 10 秒,则计时器将永远不会触发。
现在,如果 res
observable 本身就是一个更新,那么你可以这样做:
res
.Subscribe(_ =>
{
update.OnNext(true);
Console.WriteLine("Status sent.");
});
没关系 - 它仍然有效,但对于每个计时器触发 res
将创建一个新的计时器。这将意味着任何依赖您的 update
observable/subject 仍将正常运行。
关于c# - react 性扩展计时器/间隔重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33249287/