1

ある時点で私のプロジェクト内で Rx を使用することを計画しており、Rx で何ができるかを調査しています。

私のプロジェクトでは、ステート マシンの遷移を並行して処理するために TPL を使用しています (利用可能なすべてのプロセッサ コアを利用しています)。ただし、パフォーマンスを向上させるために、現在の IList<> プル メカニズムを Rx プッシュ メカニズムに置き換えたいと考えています。

私はこの技術についてよく知らないので、Rx がトークンを並列状態遷移にプッシュすることと互換性があるかどうかを確認したいと思います。すべての並列状態遷移が Rx サブジェクトにサブスクライブし、次のトークンを取得する必要があります。各状態遷移には、サブジェクトからの同じトークンが必要です。私自身の調査から私が理解していることは、トークンがオブザーバー (この場合は状態遷移) にプッシュされると、そのトークンは永久に失われるということです。その場合、(同じ状態の) 他の遷移はこのトークンを受信せず、エラー状態になります。

私の懸念が正しいかどうかについて誰かが教えてくれますか? オプションを検討しているだけなので、表示するコードはありません。

ありがとうございました。

4

3 に答える 3

1

Rxサブジェクトを.NETイベント、つまり登録されたイベントハンドラーのスレッドセーフリストに似ていると考えると役立つ場合があります。サブジェクトの場合、これらは個々のオブザーバーOnNextデリゲートと同等と見なされる場合があります。イベントが発生すると、各ハンドラーは同じイベント引数で呼び出されます。同様に、サブジェクトにサブスクライブされた各オブザーバーは、同じ引数オブジェクトで呼び出されるOnNextを取得します。この引数には、状態遷移に必要なトークンの値型または参照型が含まれる場合があります。おそらく、オブザーバーのOnNextハンドラーは、対応する並列タスクの消費のためにこのトークンを(たとえば並行キューに)格納します。

したがって、OnNext呼び出しを単に無視するか、それらが渡したオブジェクトを破棄しない限り、何も効果がありません。

タスクの1つがトークンを変更した場合、共有状態の破損の問題が発生している可能性があります。または、あるタスクが複数の状態遷移トークンを処理し、別のタスクが最初のトークンでさえデキューする時間がなかった場合、同期の問題が発生する可能性があります。ただし、これは、トークンをプッシュするための他のテクノロジーの代わりに、RxSubjectを使用することに固有のものではありません。

于 2012-11-23T07:47:48.177 に答える
0

あなたはおそらく探している

IConnectableObservable<T> IObservable<T>.Publish()

接続可能なオブザーバブルは、元のオブザーバブルのマルチキャスト バリアントであり、複数回サブスクライブできます。まず、すべてのオブザーバーを connectableobservable にサブスクライブしてから、connectableObservable で connect を呼び出します。

于 2012-11-21T08:56:28.983 に答える
-1

@Tony は、登録済みのサブスクライバー/イベント ハンドラーのスレッドセーフなリストを持つことができるという点で、Observable Sequence (IObservable) がイベントに似ていることを強調しています。そのため、イベントと同様に、多くの登録済みサブスクライバーがイベント ペイロードを受信できます (最初のサブスクライバーが最初に呼び出されるシリアル方式で)。

ただし、対処されていないのは、Rx がそのイベントに役立つ可能性がある時間についての潜在的な懸念です。たとえば、すべての並列状態遷移ハンドラーがセットアップされる前に、トークンを発行/プッシュした可能性があります。イベントまたは標準の監視可能なシーケンスを使用していた場合、ペイロードは失われます。これは、Replay などの Rx のキャッシュ機能を使用することで解決できます。これにより、遅れたサブスクライバーに最後の値をリプレイできます。

これが興味深い場合、そこにはたくさんの情報があります。詳細については、私の本のセクションをご覧ください: http://introtorx.com/Content/v1.0.10621.0/02_KeyTypes.html

于 2012-12-10T08:17:43.977 に答える