使用反应扩展每秒按顺序获取下一个事件

2023-12-13

我有以下类型...

public class NewsFeed
{
    public event EventHandler<NewsItemEventArgs> NewItem;

    .....

}

public class NewsItemEventArgs : EventArgs
{
    public NewsItem Item;
    public NewsItemEventArgs(NewsItem newsItem)
    {
        Item = newsItem;
    }
}

public class NewsItem
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }
}

NewsFeed 的 NewItem 事件触发带有 NewsItemEventArgs 类型的 eventArgs 的事件。在我的系统中,事件会突发发布,例如在 1 秒的小窗口中发布 10 个新闻项目,然后在 60 秒内不再发布新闻报道。我想用 RX 来平滑这些爆发,这样我的 UI 新闻故事“看起来”就会以更规则的间隔(例如 5 秒)一次到达一个。

我知道我需要创建一个可观察的对象,如下所示

_source = Observable.FromEventPattern<NewsItemEventArgs>(
                        h => _newsFeed.NewItem += h,
                        h => _newsFeed.NewItem -= h);

但我不知道如何转换和订阅可观察到的事件,这样我就可以滴灌事件,而不是像上面描述的那样突发事件。

有任何想法吗?


Zip 可能不是此操作的最佳选择,因为生产者有时可能会很慢,从而导致输出不稳定。

看来是准确的调度与DateTimeOffsetRx 2.0 仍然不可能。TimeSpan不过目前还可以。您可以通过更换来尝试TimeSpan偏移量DateTimeOffset.

综上所述,如果我们能够指定两个连续值之间的最小间隔,我们就可以解决突发问题。

    static IObservable<T> DelayBetweenValues<T>(this IObservable<T> observable, TimeSpan interval, IScheduler scheduler)
    {
        return Observable.Create<T>(observer =>
        {
            var offset = TimeSpan.Zero;
            return observable
                .TimeInterval(scheduler)
                .Subscribe
                (
                    ts =>
                    {
                        if (ts.Interval < interval)
                        {
                            offset = offset.Add(interval);
                            scheduler.Schedule(offset, () => observer.OnNext(ts.Value));
                        }
                        else
                        {
                            offset = TimeSpan.Zero;
                            observer.OnNext(ts.Value);
                        }
                    }
                );
        });
    }

Test:

        Observable.Interval(TimeSpan.FromSeconds(2.5))
                  .Do(_ => Console.WriteLine("Burst"))
                  .SelectMany(i => Enumerable.Range((int)i, 10))
                  .DelayBetweenValues(TimeSpan.FromSeconds(0.2), TaskPoolScheduler.Default)
                  .Subscribe(Console.WriteLine);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用反应扩展每秒按顺序获取下一个事件 的相关文章

随机推荐

  • 从 J2SE 应用程序中的 persistence.xml 外部化凭证

    我正在编写一个使用 JPA 进行持久性的 J2SE 应用程序 无企业容器 这是我的persistence xml
  • 如何在 Windows 7 上注册自定义程序来处理 mailto 协议

    好的 这可能是我的系统的问题 但我很难让 Windows 7 将我的自定义 exe 识别为 mailto 协议的默认处理程序 首先 我见过这个 以编程方式向 mailto 协议注册 Windows 程序 接下来 我看到了这些 如何使用 Wi
  • C 语言中的非阻塞 I/O? (视窗)

    我正在尝试在 Windows 终端应用程序上获得非阻塞 I O 仅限 Windows 抱歉 如果我想要一个较短的输入时间 让用户可以按下按钮 但如果他不按下按钮 输入就会停止并且程序会继续执行 该怎么办 例如 一个从 1 计数到用户按下某个
  • MapPageRoute 破坏集成 MVC/WebForms 应用程序中的 ActionLink

    我有一个用 ASP NET 4 0 开发的现有 Web 应用程序 我想向应用程序添加 MVC 功能 因此我按照 Scott Hanselman 的文章将 MVC 集成到应用程序中将 ASP NET MVC 3 集成到现有升级的 ASP NE
  • Jasper Report HTML 项目符号悬挂缩进

    我有一个 Jasper 报告 它使用 HTML 标记来显示 li 标记列表 然而 似乎即使使用最新版本的 Jasper 报告 它仍然无法正确执行悬挂缩进 这就是我要的 TEST TEST TEST TEST TEST TEST TEST T
  • 我们如何创建动态文本视图?

    如何在代码中而不是在 xml 文件中创建文本视图 这是因为我的应用程序中的文本视图数量将根据某个整数发生变化 这是动态创建TextView的代码 LinearLayout layout LinearLayout findViewById R
  • 在网络视图中显示 PDF

    我想在我的应用程序中显示 pdf 文件 我的网络服务为我提供了 pdf 我想将其下载到 SD 卡 然后我想通过 webview 在我的应用程序中显示该 pdf 我也曾因 Android PDF 显示问题而苦苦挣扎了一段时间 我采用了与您提到
  • OWL2 使用一个不同的公理对子类进行建模

    我正在尝试使用 OWL 2 DL 使用 Protege 对一些词汇数据进行建模 我的主类是 Lemma 它有许多公理 使用曼彻斯特语法 Every Lemma hasLanguage some Language Every Lemma ha
  • 在 Node.js 中发送电子邮件? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我最近开始编写我的第一个 Node j
  • 如何使用seaborn.objects旋转xticks

    碰巧 有没有办法旋转下图中的 xticks 只是为了让它更具可读性 通常sns xticks 在新的seaborn objects开发中不起作用 这太棒了 tcap assign date time2 tcap date time dt d
  • python 3.5 - django 1.10 - mysqlclient windows 7安装错误

    在 django 中配置 mysql 时 我遇到了非常令人不安的问题 我在 Ubuntu x64 上使用 python 3 5 和 Django 1 10 做到了这一点 但我无法在 Windows 7 上做到这一点 我几乎尝试了一切 我希望
  • goDaddy 网站数据库用户访问被拒绝

    我正在尝试从 godaddy 查看我的网站 域名是在其他地方注册的 托管是来自godaddy 更改 DNS 设置后 我在 godaddy 中创建数据库并导入其中的所有表 之后 我创建了一个用户名并将其授予所有权限 然后 当我尝试连接到数据库
  • WCF 超时错误 - 即使在增加值之后

    我的客户一直抱怨他们收到超时错误 但我没有看到我这边生成的跟踪文件 有人能告诉我如何解决这个问题吗 我已经将 receiveTimeout 增加到 15 分钟 00 15 00 我在 WCF 服务端和客户端都执行了此操作 我的服务不是一个长
  • 与可为空外键的一对一关系

    我想在 EF 中创建一对一关系 其中外键可以为空 因此 可以将其称为 0 1 to 0 1 public class ProductInstance public int Id get set public int SaleId get s
  • 安装plone时不支持的哈希类型

    我尝试安装plone但是当我运行脚本 install sh 时遇到问题 以下是错误详细信息 raise ValueError unsupported hash type s name ValueError unsupported hash
  • 如何用 pandas 为空行着色并导出到 Excel 文件?

    我正在尝试在 Excel 上自动执行一些任务 其中一些包括设置没有任何红色值的单元格 我的 DataFrame 维度中的空单元格 而不是其外部的空单元格 在检查之前的类似答案后 我尝试了以下操作 import pandas as pd Cr
  • 访问动态创建的文本框文本

    我偶然发现了我的 asp net 表单的问题 在我的表单中 最终用户选择要动态创建的多个文本框 这一切都可以与以下代码配合使用 protected void txtAmountSubmit Click object sender Event
  • python ctype 初始化结构体

    我的结构包含所有 unsigned char 元素 typedef struct unsigned char bE unsigned char cH unsigned char cL unsigned char EId1 unsigned
  • 如何创建多个空数据框?

    而不是这样做 a pd DataFrame d pd DataFrame c pd DataFrame d pd DataFrame e pd DataFrame 一次 有没有一种快速方法可以用空数据框初始化所有变量 因为最终我想使用 fo
  • 使用反应扩展每秒按顺序获取下一个事件

    我有以下类型 public class NewsFeed public event EventHandler