0

私のプロジェクトには、次のようにReactive 拡張機能を使用して、ヒットとミュートのようなコードがたくさんあります。

    IDisposable dsp = null;
    dsp = TargetObservable.Subscribe((incomingContent) =>
    {
        if (incomingContent == "something")
        {
            myList.Add(incomingContent);
            dsp.Dispose();
        }
    });

まず第一に、Observable は非常にビジーであり、大量のコンテンツをプッシュしているため、スレッド セーフが懸念されますが、後で、ObserveOn(thread)スレッド セーフを保証するために と組み合わせる必要があると言われました。完全に同意するので、忘れましょう。スレッドセーフなこと。

ここで知りたいのは:

  1. オブザーバブルの Dispose を呼び出す方法またはタイミング。
  2. Hit と muteを満たす正しい方法は何Take(count)ですか?
  3. OnComplete()呼び出された場合、Dispose()内部で呼び出されますよね?次に、オブザーバーとオブザーバブルの間の参照関係が壊れます(私のオブザーバブルは長寿命の静的インスタンスであるため、参照によりメモリリークが発生します)。
4

1 に答える 1

8

ここにあるパターンに従うことは避けます。他の開発者がサブスクライブ/OnNext ハンドラーの内部関数とグローバル状態を混在させる必要がある場合、問題の領域を理解するのが難しくなります。

TakeWhileシーケンスの終了をカプセル化する/TakeUntilIncluding拡張メソッドを作成する方がはるかに優れています。次に、「リストへの追加」の懸念を分離できます。

代わりに行うことは、非常に単純です。

var subscription = source.Where(x => x=="something")
                         .Take(1)
                         .Subscribe(incomingContent=>myList.Add(incomingContent));
于 2013-09-23T09:04:15.020 に答える