У меня есть поток Observable (представляющий сетевое соединение значений данных), который я воспроизводлю и повторно выполняю. Основной источник отключается, как и ожидалось, когда число подписчиков достигает нуля, но Replay (1) возвращает значение из этого источника следующему подписчику, который я считаю устаревшим. Я исправил это с помощью пользовательской реализации ReplaySubject, которая забывает последнее значение при отключении последнего наблюдателя, но это утечка абстракции, и мне интересно, есть ли более нелепый способ решения этой проблемы?
Пример неудачного теста:
[Test]
public async Task Replay_DoesNotReplay_AfterRefCountDisconnection()
{
int i = 0;
var replay = Observable.Defer(
() =>
{
i++;
return new[] {i, i}.ToObservable();
})
.Replay(1)
.RefCount();
var first = await replay.Take(1).ToTask();
var second = await replay.Take(1).ToTask();
Assert.AreEqual(1, first);
Assert.AreEqual(2, second);
}