2017-04-06 13 views
1

複数回呼び出されたときにIConnectableObservable.Connectの契約とは何ですか?複数の呼び出しに関するIConnectableObservable.Connectの契約

返されたIDisposableは、OnCompletedを公開するか、接続を切断してConnectをもう一度呼び出すことを許可する必要がありますか?

第が廃棄される前に接続が、それは、第二の時間べきで呼び出された場合:

  • スロー
  • おそらくコード
  • リターンの異なる領域からの予期しない処分を有する戻り同じIDisposableを、何らかの種類のDispose参照カウントを持つ新しいIDisposableと呼び出し元の問題を引き起こします。まだ公開値を廃棄します。

私は実装しようとしていますIConnectableObservableとそれを実装する人々のためのドキュメントは本当に軽いです。

答えて

1

あなたはsource

(書き込みのように)あなたの最初の質問への答えを見ている場合:IDisposableインターが戻ったとき

をOnCompleted公表しなければならないのに配置されているか、それだけで切断する必要がありConnectをもう一度呼び出すことができますか?最初は

処分される前に、接続が二度目に呼び出された場合

ちょうど

を切断それはする必要があります。同じIDisposableを、おそらくの異なる領域からの予期しない処分を有する戻りますコード

後書きのための興味深いコードのセクションは次のとおりです。

 public void Dispose() 
     { 
      lock (_parent._gate) 
      { 
       if (_subscription != null) 
       { 
        _subscription.Dispose(); 
        _subscription = null; 

        _parent._connection = null; 
       } 
      } 
     } 

public IDisposable Connect() 
    { 
     lock (_gate) 
     { 
      if (_connection == null) 
      { 
       var subscription = _source.SubscribeSafe(_subject); 
       _connection = new Connection(this, subscription); 
      } 

      return _connection; 
     } 
    } 

あなたが上記でわかるように同時変更を防止するロックブロック内に配置され、接続されている単一の接続があります。

+0

一般的に、私は、実装が参照実装として呼び出されていない限り、実装がどのように実装されるべきかを "正しい"解釈とみなすのは悪い考えです。 Rxのような図書館でさえ、実装を行う人は、インターフェースを書いた人と同じでないかもしれませんし、具体的なことを考えずに便利なことをしただけかもしれません。他のドキュメンテーションがなければ、私はそれがおそらく最高のリファレンスであることに同意します。 –

+0

@BryanAnderson私は原則として、単一の情報源を信頼することは問題になる可能性があることに同意します。この場合、.Net *はRxのリファレンス実装であるため、より高いレベルの信頼性を推測します。これは最も古い、最も安定したプラットフォームです。つまり、RxJSとRxJava(これはRxScalaを意味する)の少なくとも2つの実装は、同じセマンティクスを使用しています。私はそれがあなたに答えのより高い信頼を与えるなら、上記を加えることができます。 – paulpdaniels

+0

私はGitHubプロジェクトで問題を明らかにしました。Rxライブラリはインターフェイスを持っていて、インターフェイス契約は作成されてからかなり変化していますので、BCL実装のように非公式な実装の詳細については信頼できません。週末までに何も聞いていないと、私はあなたに答えているとマークします。 –

関連する問題