這個儲存庫包含四個庫,它們在概念上是相關的,因為它們都與事物序列上的 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 的設計早於 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 的平台的看法,以及這些不同目標的計畫支援生命週期: