この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 2585|答える: 2

[出典] .Netリアクティブレスポンシブ拡張機能のトピックを探求してください

[リンクをコピー]
掲載地 2024/01/27 12:17:19 | | | |
.Net Reactive Extensionは、宣言的アクションを用いてイベント処理をよりシンプルかつ表現豊かにするためのリアクティブプログラミングモデルを実装するための機能群を開発者に提供します。 リアクティブスケーリングの重要な基盤はIObserverとIObservableインターフェースですが、開発者としては自分でこれらのインターフェースを実装する必要はあまりありません。 ライブラリは組み込み型Subjectをサポートし<T>ており、インターフェースを実装し多くの機能をサポートしています。

テーマはライブラリ内のさまざまなトピックの基礎であり、他にもReplaySubject<T>、BehaviorSubject、<T>AsyncSubjectなどのテーマがあります<T>。 それらの本質的な違いを理解し、それらをどう活用すればライブラリをより良く活用できるかを理解することは有益です。

この記事では、被験者<T>とその兄弟姉妹を比較し、彼らの行動の違いを説明しようと試みます。

件名<T>

前述の通り、Subject<T>は利用可能なテーマの基盤であり、IObservable<T>やIObserver<T>インターフェースを自分で実装することなくライブラリを簡単に使える方法を提供します。 以下にテーマタイプの簡単なデモンストレーションを示します。

上記のコードでは<T>Subjectのインスタンスを作成し、<T>IObserverとIObserverableの両方を実装しているため<T>、同じインスタンスを使ってIObserverに値をサブスクライブし、公開します。 ここでもう一つ重要な点は、Subscribeメソッドのオーバーロードを使ってアクションを入力として受け入れる方法です。 これは公開された各数値ごとに行われ、この場合はその数値をコンソールに印刷します。

次の画像で公開された値と、IObserver(このアクションで<T>)がコンソールに出力する値を示してみます。 これにより、残りの兄弟姉妹やバリアントを簡単に比較できるようになります。



最初の行は公開された値を表し、2行目はIObserverが受け取った値を表します。 さらに、実行中にオブザーバーがストリームにどの時点で加入するかを示す行を追加しました。 この線は垂直の点線で表されます。

上記のコードでは、観測者が最初の値を公開する前にデータストリームに加入していることに気づきました。 画像は最初の要素の前に置かれた加入者ラインを示しています。 出力ラインからもわかるように、この時点では出力には影響しません。

しかし、もし観測者がすでにいくつかの値を公表した後にしかデータを登録しなかったらどうでしょうか? これは観測者が受け取るデータに影響を与えますか? 出力を見る前に、まず同じコードを書いてみましょう。

上記のコードでは、観測者がデータストリームにサブスクライブするのは、2つの値(1と2)が公開された後にのみであることが観察できます。 予想通り、これにより観測者はサブスクリプション方式を呼び出す前に公開されたデータを受け取れなくなります。 下の図に示す通りです。



もし観測者が遅れて購読しても、すべての公開値を読みたいとしたらどうしますか? ここでReplaySubject<T>の登場です。

リプレイ被験者<T>

ReplaySubject<T>は値をキャッシュし、後の加入者のために再再生します。 これはレースコンディションを避けるのに役立ちます。 前のコードをReplaySubjectに変え<T>て、観察者が受け取るものにどう影響するか見てみましょう。

上記のコードに示されているように、コード<T><T>にほとんど変更はありませんが、今は主体ではなくReplaySubjectを使うようになりました。 以下の図は、観測者が受け取ったデータへの影響を示しています。



画像に示すように、キャッシュされた値は加入者が後で加入しても再再生されます。 もちろん、この便利な機能には代償が伴います。 この実装は、加入者が公開したすべての値をキャッシュするため、データ量が大きくなるとメモリの問題を引き起こすことがあります。

しかし、ReplaySubjectには<T>この問題を解決する複数の方法があります。 この例のために、キャッシュ値のサイズと時間制約を用いて制限する2つの例を見ていきます。

最初のケースでは、キャッシュのサイズを使ってキャッシュの値を制限します。 <T>ReplaySubjectのコンストラクタはオーバーロードを提供し、キャッシュバッファのサイズ(最大要素数)を表す整数を受け入れます。 例では、キャッシュサイズを1に制限するコードを変更します。

<T>ReplaySubjectのコンストラクタオーバーロードを使ってキャッシュのサイズを1にしているのに注目してください。 これによりキャッシュが制限され、1つの要素だけがキャッシュされ、公開されるとすぐに新しい要素に置き換えられます。 この変更の影響は以下に示されています。



キャッシュを制限するもう一つの方法は、キャッシュされたアイテムの時間を制限する、つまりキャッシュされたアイテムの有効期限を指定することです。

その例を示すコードを書きましょう。

前回のコードと同様に、<T>ReplaySubjectコンストラクタのオーバーロードを使ってキャッシュ内のアイテムの有効期限を指定します。 私たちのケースを示すために、値のリリースの間に遅延を導入しました。

オブザーバーがサブスクライブするまでに1200msかかるため、1000msを超える要素はキャッシュから削除されます。 この例では、これにより値1がキャッシュから削除され、遅延加入者には再生されません。 下の図に示す通りです。



<T>ReplaySubjectには他にも柔軟性を持たせ、キャッシュ値を微調整できるオーバーロードがありますが、例としてはすでに挙げた2つの例をそのままにします。

行動対象<T>

BehaviourSubject<T>はReplaySubjectと非常に似ており<T>、値のキャッシュを助けます。 しかし、そこには大きな違いがあります。 BehaviourSubject<T>は最後に公開された値のみをキャッシュします。 これ以上進む前に、まずコードを書いてみましょう。

もしBehaviorSubjectが<T>最後に知られている単一の値しかキャッシュしない場合、サイズ1のReplaySubjectとどう違う<T>のでしょうか? 以下の図は上記のコードの状況を明確に反映しています。



しかし、これは完全に正しいわけではありません。 ここで理解すべき重要な違いが二つあります。 一つ目はデフォルト(デフォルト)の存在です。 上記のコードでは、<T>BehaviourSubjectの構成体でデフォルト値0を指定しています。 キャッシュに値が存在しない場合(つまり、観測者がサブスクライブする前にデータが公開されていない場合)、デフォルト値が返されます。 これはReplaySubjectとは異なり、ReplaySubjectはサイズが1で<T>、値がありません。 以下のコードとシーケンスの視覚的表現はこの挙動を示しています。



2つ目の違いは<T> <T> 、完成したシーケンスを購読した際のBehaviorSubjectとReplaySubjectの挙動です。 完了後に購読すると、<T>以下のコードに示されているように、BehaviorSubjectには価値がなくなります。

購読者は、サブスクリプションが完了後に行われるため、価値を得ることは保証されません。



しかし、<T>これはReplaySubjectの場合です。 下記コードに示されているように、観測者が値を受け取らない保証はありません。

上記のコードに示されているように、キャッシュのサイズは1で、呼び出しが完了した後にサブスクリプションが呼び出されても、期限切れ条件が満たされるまでキャッシュは保持されます。したがって、この場合は最後に公開された値が受信されます。



非同期主体<T>

AsyncSubject<T>は本記事で探る対象の最後の兄弟であり<T>、前述の2つ(ReplaySubjectとBehaviourSubject)と同様に結果もキャッシュされます。 しかし、ここでも大きな違いがあります。 AsyncSubjectは、シーケンスが完了したとマークされている場合のみ、最後のキャッシュ値を公開します(キャッシュするのは<T>最後の1つの値のみです)。

次のコードを検討してください。

これにより、観測者に対して、完了前に最後に公開された数値としてマークされた値を生成します - 値4。 下の図に示す通りです。



しかし、シーケンスを完了とマークするコールをスキップしたらどうなるのでしょうか? コメントを割り込んでもう一度やり直しましょう。

AsyncSubjectは<T>シーケンスが完了した後にのみ結果を公開するため、観察者にはデータを生成しません。



これはAsyncSubjectを使う人が覚え<T>ておくべき重要な違いです。

結論

この記事では、<T>Subjectの兄弟姉妹といくつかのバリエーションの違いを示します。 こうした微妙な違いに気づくことはしばしば役立ちます。気づかないと予想とは異なる挙動を示すことがあるからです。

元のリンク:ハイパーリンクのログインが見えます。





先の:.NET/C#はTCPポートが利用可能かどうかを確認します
次に:NSIS(1) 簡単なインストーラーを作成する
 地主| 掲載地 2024/01/27 12:19:47 |
Angular RxJSの主題トピック購読
https://www.itsvse.com/thread-9209-1-1.html
 地主| 掲載地 2024/04/28 11:36:59 |
ASP.NET CoreはMediatR仲介モデルを使用しています
https://www.itsvse.com/thread-9272-1-1.html
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com