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

标签 c# system.reactive

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

相关文章:

c# - 将可观察字节数组转换为对象

wcf - 如何使用 Moq 模拟 WCF 客户端?

c# - Subject<T> 停止发布项目

c# - 接收 : Piecing together multiple IObservable web requests

c# - 在 GridView (ASP.NET) 中编辑一个没有键(值对象)的对象

c# - iOS 系统时间戳 - C# Monotouch/Xamarin

c# - 一种以均匀间隔推送缓冲事件的方法

c# - Azure功能:我无法选择消费计划

c# - asp.net mvc 5 cookies 不持久在本地服务器上

c# - 如何在 NET Core 中播放声音?