2017-04-06 27 views
1

當多次調用IConnectableObservable.Connect時,合同應該是什麼?針對多次調用的IConnectableObservable.Connect合同

如果返回的IDisposable被丟棄,應該發佈OnCompleted還是應該斷開連接並允許第二次調用Connect?

如果之前所述第一佈置的連接被稱爲第二時間,應該它:

  • 返回相同的IDisposable,可能具有的代碼
  • 返回不同區域意想不到的處置一個新的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)使用相同的語義。我可以補充一點,如果它會給你更高的答案信心。 – paulpdaniels

+0

我在他們的GitHub項目中提出了一個問題,要求澄清。Rx庫自從創建它們之後,其接口和接口協議就發生了很多變化,所以我不太相信非官方的實現細節,因爲我會用BCL實現之一。如果週末沒有聽到任何消息,我會將你的回答標記爲已接受。 –