该存储库包含四个库,它们在概念上是相关的,因为它们都与事物序列上的 LINQ 相关:
Reactive Extensions for .NET 又名 Rx.NET 或 Rx (System.Reactive):一个用于事件驱动编程的库,具有可组合的声明性模型
AsyncRx.NET(实验性预览)(System.Reactive.Async): IAsyncObservable<T>
的 Rx 实验性实现,提供更深入的async
/ await
支持
Interactive Extensions for .NET,又名 Ix (System.Interactive): IAsyncEnumerable
和IEnumerable
的扩展 LINQ 运算符
LINQ for IAsyncEnumerable
(System.Linq.Async):为IAsyncEnumerable
实现标准 LINQ 运算符
每个将在本自述文件中稍后进行描述。
当我们的代码需要响应事件时,反应式编程提供了清晰的思路。 Rx.NET 库旨在使云原生应用程序能够以可靠、可预测的方式处理实时数据。
我们编写了一本免费的书,解释了支撑 Rx 的重要抽象,并展示了如何利用 Rx.NET 库中内置的强大而广泛的功能。
它基于 Lee Campbell 2010 年的书(善意捐赠给该项目)进行了重写,以使其与 Rx.NET v6.0、.NET 8.0 和现代云原生用例(例如 IoT 和 Real-)保持同步。时间流数据处理。
Rx.NET 简介可在 GitHub 上在线获取,格式为 PDF 和 EPUB。
渠道 | 接收 | 异步接收 | IX | 系统.Linq.Async |
---|---|---|---|---|
NuGet.org | ||||
NuGet.org 预览版(如果比发行版更新) | ||||
建造 | 作为 Ix 的一部分构建 | |||
天蓝色 文物 | ||||
发布历史 | 发布历史 | 发布历史 | 发布历史 |
对于夜间构建,配置 NuGet 以使用此源: https://pkgs.dev.azure.com/dotnet/Rx.NET/_packaging/RxNet/nuget/v3/index.json
在 #rxnet 频道 https://reactivex.slack.com/ 上关注我们
在这个数字时代,实时数据流无处不在。金融应用程序依赖于对及时信息的快速响应。计算机网络始终能够提供有关其健康状况和运行情况的广泛信息。供水公司等公用事业公司拥有大量监控其运营的设备。用户界面和游戏构建框架非常详细地报告用户交互。送货车不断报告其进度。飞机提供性能遥测功能,以便在潜在的维护问题变得严重之前检测到它们,汽车现在也开始这样做。我们中的许多人都佩戴或携带跟踪我们身体活动甚至生命体征的设备。机器学习的进步丰富了从不断增加的数量和种类的实时数据中得出的见解。
但尽管实时信息流如此普遍,但它始终处于二等公民的地位。几乎所有编程语言都有一些固有的方式来处理数据列表(例如数组),但这些机制倾向于假设相关数据已经位于内存中,可供我们使用它。缺少的是活力——信息源可能随时按照自己的时间表产生新数据。
Rx 将对实时信息流的支持提升到了我们对数组等事物的期望水平。这是一个例子:
var bigTrades = 来自 trade.Volume > 1_000_000 的交易中的交易选择交易;
它使用 C# 的 LINQ 功能来过滤trades
量超过 100 万的实体。这个查询表达式语法只是方法调用的简写,所以我们也可以这样写:
var bigTrades = trades.Where(trade => trade.Volume > 1_000_000);
这两个(等效)代码片段的确切行为取决于trades
类型。如果它是IEnumerable<Trade>
,那么此查询将仅迭代列表,并且bigTrades
将是仅包含匹配对象的可枚举序列。如果trades
是代表数据库表的对象(例如,实体框架 DbSet,这将被转换为数据库查询。但是如果我们使用 Rx, trades
将是IObservable<Trade>
,一个报告实时事件的对象bigTrades
也将是IObservable<Trade>
,仅报告交易量超过 100 万的交易,我们可以为 Rx 提供每次可观察源有数据时调用的回调。对我们来说:
bigTrades.Subscribe(t => Console.WriteLine($"{t.Symbol}: 交易量 {t.Volume}"));
Rx 的两个主要特性是:
一种明确定义的方式来表示和处理实时数据序列( IObservable<T>
)
一组运算符(例如刚刚显示的Where
运算符),使事件处理逻辑能够以声明方式表达
Rx 在用户界面中的应用尤其成功。 (在 .NET 之外也是如此 — RxJS 是 Rx 的 JavaScript 衍生产品,它在用户界面代码中非常流行。)https://github.com/reactiveui/reactiveui 深度利用 Rx 来支持.NET UI 开发。
Ian Griffiths 在 2020 年 dotnetsheff 聚会上对 .NET 的响应式扩展进行了 60 分钟的简明概述。更多视频可在 Rx 播放列表中找到。
尽管 Rx 是对异步流程进行建模的自然方法,但其原始设计假定作用于通知的代码将同步运行。这是因为 Rx 的设计早于 C# 的async
/ await
语言功能。因此,尽管 Rx 提供了可以在IObservable<T>
和Task<T>
之间进行转换的适配器,但在某些情况下, async
不是一个选项。
AsyncRx.Net 通过定义IAsyncObservable<T>
解除了此限制。这使得观察者能够使用异步代码。例如,如果bigTrades
是IAsyncObservable<Trade>
我们可以这样写:
bigTrades.Subscribe(async t => 等待 bigTradeStore.LogTradeAsync(t));
AsyncRx.Net 目前处于预览阶段。
Rx 定义了其他提供程序可用的所有标准 LINQ 运算符,但它还添加了许多其他运算符。例如,它定义了Scan
,它执行与标准Aggregate
运算符相同的基本处理,但它不是在处理每个元素后生成单个结果,而是在每个步骤后生成包含聚合值的序列。 (例如,如果聚合操作是加法, Aggregate
会将总和作为单个输出返回,而Scan
将为每个输入生成一个运行总计。给定一个序列[1,2,3]
, Aggregate((a, x) => a + x)
只产生6
,而Scan
会产生[1,3,6]
。)
Rx 定义的一些附加运算符仅在您处理事件时才有用。但有些适用于任何类型的序列。因此,交互式扩展(简称 Ix)定义了IEnumerable<T>
的实现。 Ix 实际上是 LINQ to Objects 的扩展,添加了许多附加运算符。 (随着时间的推移,.NET 运行时库添加了一些以前仅在 Ix 中可用的运算符,这一事实证明了它的有用性。例如,.NET 6 添加了MinBy
和MaxBy
,这些运算符以前仅由九)
该库被称为“交互式扩展”,因为“交互式”在某种意义上与“响应式”相反。 (该名称并非指用户交互。)
IAsyncEnumerable
的 LINQ ( System.Linq.Async
) Ix 首创的功能之一是IEnumerable<T>
的异步版本。这是另一个非常有用的功能示例,最终被添加到 .NET 运行时库中:.NET Core 3.0 引入了IAsyncEnumerable<T>
,并且相关版本 C# (8.0) 通过其await foreach
构造添加了对此接口的内在支持。
虽然.NET Core 3.0定义了IAsyncEnumerable<T>
,但它没有添加任何相应的LINQ实现。尽管IEnumerable<T>
支持所有标准运算符(例如Where
、 GroupBy
和SelectMany
,但 .NET 没有IAsyncEnumerable<T>
的任何内置实现。然而,Ix 从一开始就为其原型版本的IAsyncEnumerable<T>
提供了 LINQ 运算符,因此当 .NET Core 3.0 发布时,更新所有现有的 LINQ 运算符以与新的官方IAsyncEnumerable<T>
配合使用是一项相对简单的任务。 IAsyncEnumerable<T>
.
因此,创建了 System.Linq.Async NuGet 包,为IAsyncEnumerable<T>
提供 LINQ to Objects 实现,以匹配 .NET 中已内置的IEnumerable<T>
实现。
由于所有相关代码已经是 Ix 项目的一部分( IAsyncEnumerable<T>
最初也是由该项目定义的),因此 System.Linq.Async NuGet 包将作为 Ix 项目的一部分构建。
一些最好的贡献方式是尝试、提交错误以及参与设计对话。
克隆源: git clone https://github.com/dotnet/reactive
构建、测试和调试源代码
如何贡献
拉取请求:打开/关闭
正在寻找工作吗?待解决问题列表是一个很好的起点。
该项目采用了改编自贡献者契约的行为准则,以阐明我们社区的预期行为。该行为准则已被许多其他项目采用。欲了解更多信息,请参阅行为准则。
该项目与 .NET 运行时等其他项目一起属于 .NET 基金会的一部分。 .NET 基金会为该项目提供了 DevOps 基础设施,以编译、测试、签名和打包这一复杂的解决方案,该解决方案的下载量已超过 1 亿次。它还提供托管服务,使项目能够从一个维护者转移到另一个维护者,从而实现社区的连续性。
目前维护 Rx 的人员有:
伊恩·格里菲斯 英国霍夫 Ian 在 endjin.com 上的博客 | 霍华德·范·罗伊延 英国温彻斯特 Howard 在 endjin.com 上的博客 |
Rx 已经存在了大约十五年了,所以我们非常感谢它的创建者以及从那时起一直致力于它的许多人。有关完整列表,请参阅 AUTHORS.txt。
作为 .NET Conf 2023 的一部分,Ian Griffiths 提供了有关 v6.0 的 Rx.NET 现代化工作的最新信息以及 v7.0 的计划。
有关更多信息,请参阅以下讨论:
未来的 Rx.NET 封装
Rx.NET v6.0 和 v7.0 高级计划
我们制定了路线图,解释了 Rx 持续开发的中期计划。该图说明了我们对使用 Rx 的平台的看法,以及这些不同目标的计划支持生命周期: