关于多个调用的 IConnectableObservable.Connect 合约

问题描述 投票:0回答:1

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

当返回的 IDisposable 被处理后,应该发布 OnCompleted 还是应该断开连接并允许再次调用 Connect?

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

  • 返回相同的 IDisposable,可能会从不同的代码区域进行意外处置
  • 使用某种 Dispose 引用计数返回新的 IDisposable,并导致您在仍在发布值上调用 Dispose 的源出现问题

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

.net system.reactive observable
1个回答
2
投票

如果您查看来源

第一个问题的答案(截至撰写本文时):

当返回的 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;
        }
    }

正如您在上面看到的,有一个连接被释放并连接到一个锁块内,以防止并发修改。

© www.soinside.com 2019 - 2024. All rights reserved.