このリポジトリには、一連の LINQ に関係するという点で概念的に関連している 4 つのライブラリが含まれています。
Reactive Extensions for .NET 別名 Rx.NET または Rx (System.Reactive): 構成可能な宣言型モデルを使用したイベント駆動型プログラミング用のライブラリ
AsyncRx.NET (実験的プレビュー) (System.Reactive.Async): より詳細なasync
/ await
サポートを提供するIAsyncObservable<T>
用の Rx の実験的実装
Interactive Extensions for .NET、別名 Ix (System.Interactive): IAsyncEnumerable
およびIEnumerable
の拡張 LINQ 演算子
LINQ for IAsyncEnumerable
(System.Linq.Async): IAsyncEnumerable
の標準 LINQ 演算子を実装します。
それぞれについては、この README の後半で説明します。
リアクティブ プログラミングにより、コードがイベントに応答する必要がある時期が明確になります。 Rx.NET ライブラリは、クラウドネイティブ アプリケーションが信頼性が高く、予測可能な方法でライブ データを処理できるように設計されています。
私たちは、Rx を支える重要な抽象化を説明し、Rx.NET ライブラリに組み込まれた強力で広範な機能を活用する方法を示す無料の本を書きました。
Lee Campbell の 2010 年の書籍 (ご厚意によりプロジェクトに寄贈) に基づいて、Rx.NET v6.0、.NET 8.0、および IoT やリアルタイムストリームデータ処理。
Rx.NET の概要は、オンライン、GitHub、PDF、および EPUB で入手できます。
チャネル | 受信 | 非同期受信 | イクス | System.Linq.Async |
---|---|---|---|---|
NuGet.org | ||||
NuGet.org プレビュー (リリースより新しい場合) | ||||
建てる | Ix の一部として構築 | |||
アズール アーティファクト | ||||
発売履歴 | リリース履歴 | リリース履歴 | リリース履歴 |
夜間ビルドの場合は、このフィードを使用するように NuGet を構成します: https://pkgs.dev.azure.com/dotnet/Rx.NET/_packaging/RxNet/nuget/v3/index.json
https://reactivex.slack.com/ の #rxnet チャンネルでご確認ください。
このデジタル時代では、ライブ データ ストリームが至る所に存在します。金融アプリケーションは、タイムリーな情報に迅速に対応できるかどうかにかかっています。コンピュータ ネットワークは常に、コンピュータの状態と動作に関する広範な情報を提供できます。水道業者などの公益企業は、業務を監視する膨大な数のデバイスを備えています。ユーザー インターフェイスとゲーム構築フレームワークは、ユーザー インタラクションを詳細にレポートします。配達用バンは進捗状況を継続的に報告します。航空機は潜在的なメンテナンス上の問題を重大な問題になる前に検出するためのパフォーマンス テレメトリを提供しており、自動車も同様のことを行い始めています。私たちの多くは、身体活動やバイタルサインさえも追跡するデバイスを着用または携帯しています。また、機械学習の改善により、量と種類が増え続けるライブデータから得られる洞察が強化されました。
しかし、これほど普及しているにもかかわらず、ライブ情報ストリームは常に二級市民のようなものでした。ほとんどすべてのプログラミング言語には、データのリスト (配列など) を操作するための何らかの固有の方法がありますが、これらのメカニズムは、関連するデータがすでにメモリ内に存在し、すぐに操作できる状態にあると想定する傾向があります。欠けているのは、ライブ性、つまり情報ソースがいつでも独自のスケジュールに従って新しいデータを生成する可能性があるという事実です。
Rx は、情報のライブ ストリームのサポートを、配列などに期待されるのと同じレベルに引き上げます。以下に例を示します。
var bigTrades = trade.Volume > 1_000_000 の取引の取引から取引を選択します。
これは、C# の LINQ 機能を使用して、 trades
フィルター処理して、ボリュームが 100 万を超えるエンティティに絞り込みます。このクエリ式構文はメソッド呼び出しの短縮形にすぎないため、次のように記述することもできます。
var bigTrades = trades.Where(trade => trade.ボリューム > 1_000_000);
これら 2 つの (同等の) コード スニペットの正確な動作は、 trades
タイプによって異なります。 IEnumerable<Trade>
の場合、このクエリはリストを反復処理するだけで、 bigTrades
一致するオブジェクトのみを含む列挙可能なシーケンスになります。 trades
データベース テーブルを表すオブジェクト (Entity Framework DbSet など) である場合、これはデータベース クエリに変換されます。しかし、Rx を使用している場合、 trades
IObservable<Trade>
となり、ライブ イベントをレポートするオブジェクトになります。また、 bigTrades
IObservable<Trade>
となり、取引量が 100 万を超える取引のみを報告します。Rx に毎回呼び出されるコールバックを提供できます。観察可能なソースには、次のようなものがあります。
bigTrades.Subscribe(t => Console.WriteLine($"{t.Symbol}: 取引高 {t.Volume}"));
Rx の 2 つの主要な機能は次のとおりです。
データのライブ シーケンスを表現および処理するための明確に定義された方法 ( IObservable<T>
)
イベント処理ロジックを宣言的に表現できるようにする一連の演算子 (先ほど示したWhere
演算子など)
Rx は、ユーザー インターフェイスに特にうまく適用されています。 (これは .NET の外にも当てはまります。RxJS は Rx から派生した JavaScript であり、ユーザー インターフェイス コードで非常に人気があります。) https://github.com/reactiveui/reactiveui は Rx を深く利用してサポートを行っています。 .NET UI開発。
Ian Griffiths は、2020 年の dotnetsheff ミートアップで、.NET 向け Reactive Extensions の簡潔な 60 分間の概要を発表しました。Rx プレイリストでは、その他のビデオもご覧いただけます。
Rx は非同期プロセスをモデル化する自然な方法ですが、その元の設計では、通知に作用するコードが同期的に実行されることを前提としていました。これは、Rx の設計が C# のasync
/ await
言語機能よりも古いものであるためです。したがって、Rx はIObservable<T>
とTask<T>
の間で変換できるアダプターを提供しますが、 async
オプションではない特定のケースがありました。
AsyncRx.Net は、 IAsyncObservable<T>
を定義することでこの制限を解除します。これにより、オブザーバーは非同期コードを使用できるようになります。たとえば、 bigTrades
がIAsyncObservable<Trade>
の場合、次のように記述できます。
bigTrades.Subscribe(async t => await bigTradeStore.LogTradeAsync(t));
AsyncRx.Net は現在プレビュー段階です。
Rx は、他のプロバイダーで使用できるすべての標準 LINQ 演算子を定義しますが、多数の追加演算子も追加します。たとえば、標準のAggregate
演算子と同じ基本処理を実行するScan
を定義しますが、すべての要素を処理した後に単一の結果を生成するのではなく、単一のステップごとに集計値を含むシーケンスを生成します。 (たとえば、集計対象の操作が加算の場合、 Aggregate
合計を 1 つの出力として返しますが、 Scan
各入力の累計を生成します。シーケンス[1,2,3]
が与えられると、 Aggregate((a, x) => a + x)
は6
のみを生成しますが、 Scan
[1,3,6]
を生成します。)
Rx が定義する追加の演算子の一部は、イベントを操作する場合にのみ役立ちます。しかし、いくつかはあらゆる種類のシーケンスに適用できます。したがって、Interactive Extensions (略して Ix) はIEnumerable<T>
の実装を定義します。 Ix は実質的に LINQ to Objects の拡張機能であり、多数の追加演算子が追加されています。 (その有用性は、.NET ランタイム ライブラリが、以前は Ix でのみ使用可能だった演算子の一部を時間の経過とともに追加したという事実によって裏付けられています。たとえば、.NET 6 では、以前は によってのみ定義されていた演算子MinBy
とMaxBy
が追加されました。九)
このライブラリは「Interactive Extensions」と呼ばれます。これは、「Interactive」が「Reactive」の反対であるためです。 (この名前はユーザー インタラクションを指すものではありません。)
IAsyncEnumerable
( System.Linq.Async
) Ix によって開拓された機能の 1 つは、 IEnumerable<T>
の非同期バージョンでした。これは、最終的に .NET ランタイム ライブラリに追加された非常に便利な機能のもう 1 つの例です。.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 パッケージが作成され、 IEnumerable<T>
用に .NET に既に組み込まれている実装と一致するIAsyncEnumerable<T>
用の LINQ to Objects 実装が提供されました。
関連するコードはすべてすでに Ix プロジェクトの一部であったため ( IAsyncEnumerable<T>
も元々このプロジェクトによって定義されていた)、System.Linq.Async NuGet パッケージは Ix プロジェクトの一部としてビルドされます。
貢献するための最良の方法は、何かを試してみたり、バグを報告したり、設計に関する会話に参加したりすることです。
ソースのクローンを作成します: git clone https://github.com/dotnet/reactive
ソースのビルド、テスト、デバッグ
貢献方法
プル リクエスト: オープン/クローズ
何か取り組むべきことをお探しですか?入手可能な問題のリストは、始めるのに最適な場所です。
このプロジェクトは、コミュニティで期待される行動を明確にするために、貢献者規約を基にした行動規範を採用しています。この行動規範は他の多くのプロジェクトでも採用されています。詳細については、行動規範を参照してください。
このプロジェクトは、.NET ランタイムなどの他のプロジェクトとともに .NET Foundation の一部です。 .NET Foundation は、ダウンロード数が 1 億を超えるこの複雑なソリューションをコンパイル、テスト、署名、パッケージ化するための DevOps インフラストラクチャをこのプロジェクトに提供しています。また、プロジェクトをメンテナーからメンテナーに引き継ぐことを可能にする後見人制度も提供され、コミュニティの継続性が可能になります。
現在 Rx を保守している人は次のとおりです。
イアン・グリフィス ホーヴ, イギリス endjin.com の Ian のブログ | ハワード・ヴァン・ローイジェン ウィンチェスター、イギリス endjin.com の Howard のブログ |
Rx は約 15 年前から存在しているため、私たちはその作成者と、それ以来それに取り組んできた多くの人々に多大な感謝をしています。完全なリストについては、AUTHORS.txt を参照してください。
.NET Conf 2023 の一環として、Ian Griffiths は、Rx.NET v6.0 の最新化の取り組みと v7.0 の計画に関する最新情報を提供しました。
詳細については、次の説明を参照してください。
将来の Rx.NET パッケージ化
Rx.NET v6.0 および v7.0 のハイレベル プラン
私たちは、Rx の継続的な開発の中期計画を説明するロードマップを設定しました。この図は、Rx が使用されるプラットフォームと、これらのさまざまなターゲットに対して計画されているサポート ライフサイクルについての当社の見解を示しています。