gpt4 book ai didi

c# - react 性扩展计时器/间隔重置

转载 作者:行者123 更新时间:2023-11-30 14:27:18 28 4
gpt4 key购买 nike

我有一个项目,我需要每 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com