关于多个呼叫的IConnectableObservable.Connect合同

时间:2017-04-06 01:38:14

标签: .net system.reactive observable

当IConnectableObservable.Connect被多次调用时,该合约应该是什么?

如果处理的IDisposable被处理掉,应该发布OnCompleted还是只是断开连接并允许第二次调用Connect?

如果在第一次处理Connect之前第二次调用Connect,则应该:

  • 投掷
  • 返回相同的IDisposable,可能意外地从不同的代码区域处置
  • 使用某种Dispose引用计数返回一个新的IDisposable,并导致您在仍然发布值时调用Dispose的来源出现问题

我正在尝试实现IConnectableObservable,实现它的人员的文档非常简单。

1 个答案:

答案 0 :(得分:1)

如果您查看source

第一个问题的答案(撰写时):

  

如果处理的IDisposable被处理掉,应该发布OnCompleted还是只是断开连接并允许第二次调用Connect?

断开连接

  

如果在第一次处理之前第二次调用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;
        }
    }

正如您在上面所看到的那样,只有一个连接被配置并连接到一个锁定块内,以防止并发修改。