为什么TakeLast <t>()方法不适用于ReplaySubject <t> </t> </t>

时间:2011-07-20 10:07:45

标签: c# .net system.reactive

根据MSDN文档,以下代码应将“5”输出到控制台窗口。相反,没有显示任何内容。

static void Main(string[] args)
{
     var o = new ReplaySubject<int>();

     o.OnNext(0);
     o.OnNext(1);
     o.OnNext(2);
     o.OnNext(3);
     o.OnNext(4);
     o.OnNext(5);

     o.TakeLast(1).Subscribe(Console.WriteLine);

     Console.WriteLine("Press any key to exit");
     Console.ReadKey();
}

预期产出:

5
Press any key to exit

实际输出:

Press any key to exit

任何人都可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:5)

那是因为您从未通知序列的完成,因此TakeLast不知道序列是否完整并继续等待序列的结束。这按预期工作:

var o = new ReplaySubject<int>();

o.OnNext(0);
o.OnNext(1);
o.OnNext(2);
o.OnNext(3);
o.OnNext(4);
o.OnNext(5);
o.OnCompleted();

o.TakeLast(1).Subscribe(Console.WriteLine);