如何使用 Observable.Generate 在控制台中输出

bao*_*ozi 1 c# system.reactive

为什么下面的代码没有输出?

它是一个控制台应用程序,用于生成一些随机值(我正在学习反应式扩展)。

using System.Reactive.Linq;

static void Main(string[] args)
{   
    var rand = new Random();
    Observable.Generate(
        5.0,
        i => i > 0,
        i => i + rand.NextDouble() - 0.5,
        i => i,
        i => TimeSpan.FromSeconds(0.1)
    ).Subscribe(Console.WriteLine);  
}
Run Code Online (Sandbox Code Playgroud)

Blo*_*ard 5

AnObservable表示异步数据流。因为您将时间跨度传递给Generate,所以数字生成是在后台线程中发生的。

当你的Main函数退出时,主线程也退出。当主线程退出时,后台线程将被杀死。

由于您的Main函数将在 0.1 秒过去之前退出,因此您的生成器没有时间生成任何内容。尝试添加Console.ReadLine();到函数的末尾Main,这样后台线程就不会被终止,直到您按下某个键。

  • 顺便提一句。如果有人使用 Rx 的计时功能,则数字生成仅在后台线程中运行。如果仅使用 4 个参数调用 Observable.Generate,则不会创建后台线程,程序将无限循环地在主线程上运行。 (2认同)
  • 一个“Observable”代表一个具有异步能力的发布/订阅源。与 Node.js 中的 Promise 和回调不同,“Observable”不一定是异步的。示例:“Observable.Return”,甚至“Observable.Generate”创建同步“Observable”,许多 Rx 运算符还返回一个与它们操作的源具有相同同步性的可观察值。示例:“Select”、“SelectMany”、“Aggregate”、“Scan”、“Count”等。但是,这些*确实*包含用于指定调度程序的重载,该重载*可以*更改操作的同步性。 (2认同)