c# - 为什么 TakeLast<T>() 方法不适用于 ReplaySubject<T>

标签 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

谁能解释一下为什么会这样?

最佳答案

那是因为你从来没有通知序列完成,所以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);

关于c# - 为什么 TakeLast<T>() 方法不适用于 ReplaySubject<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6760212/

相关文章:

c# - 不同的线程在 WPF 中拥有它

c# - 何时在 WPF 中使用 Rx 处理鼠标事件

c# - 异步返回集合的各种方式(具有 C# 7 特性)

system.reactive - “rate limit”消耗Observable的最佳方法是什么?

c# - Azure DefaultAzureCredential 正在尝试在开发环境中从 169.254.169.254 获取 oauth token

c# - Unity WebRequest 与 C++ 套接字对话

c# - C# 中需要可选的 VB 参数

c# - 使用 BitConverter 在 C# 中进行快速转换,它能更快吗?

c# - 添加 ASP.NET MVC5 部分 View 时出现异常

C# LINQ 和涉及大型数据集的计算