最好的方法是
.Replay()
void Main()
{
var g = new Generator<int>();
var ongoingItems = g.Items;
var allItems = g.Items.Replay().RefCount();
using(var tempSubscriber = allItems.Subscribe())
{
g.Push(1);
g.Push(2);
ongoingItems.Subscribe(x => Console.WriteLine($"Ongoing: got {x}"));
allItems.Subscribe(x => Console.WriteLine($"WithHistory: got {x}"));
g.Push(3);
g.Push(4);
g.Push(5);
Console.ReadLine();
}
}
.Replay().RefCount()
生成一个observable,它将保留一个内部队列以便重播,只要有订户。但是,如果您有一个持久订户(就像您的解决方案在
WithHistory
方法),内存泄漏。解决这一问题的最佳方法是拥有一个临时订户,当您不再对历史感兴趣时,它会自动断开连接。