2017-04-06 25 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实现之一。如果周末没有听到任何消息,我会将你的回答标记为已接受。 –