它被多次调用时,IConnectableObservable.Connect的合约应该是什么?
当释放返回的 IDisposable 时,应该发布 OnComplete,还是应该断开连接并允许第二次调用 Connect?
如果在释放第一个 Connect 之前第二次调用 Connect,它应该:
- 扔
- 返回相同的 IDisposable,可能来自不同代码区域的意外释放
- 返回具有某种"处置引用计数"的新 IDisposable,并导致您称为"处置"的源出现问题,该源仍在发布值
我正在尝试实现 IConnectableObservable,实现它的人的文档非常轻巧。
如果你看一下源代码
第一个问题的答案(截至撰写本文时(:
当释放返回的 IDisposable 时,应该发布 OnComplete,还是应该断开连接并允许第二次调用 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;
}
}
正如您在上面看到的,有一个连接在锁定块内被处置和连接,以防止并发修改。