C# 如何使用Observable.Generate在控制台中输出
为什么下面的代码不产生输出 它是一个控制台应用程序,可以生成一些随机值(我正在学习被动扩展)C# 如何使用Observable.Generate在控制台中输出,c#,system.reactive,C#,System.reactive,为什么下面的代码不产生输出 它是一个控制台应用程序,可以生成一些随机值(我正在学习被动扩展) 可观察的表示异步数据流。因为您要将时间跨度传递给生成,所以数字生成是在后台线程中进行的 当Main函数退出时,主线程退出。当主线程退出时,后台线程被终止 由于Main函数将在0.1秒之前退出,因此生成器没有时间生成任何内容。尝试添加Console.ReadLine()到主函数的末尾,因此后台线程在您按键之前不会被终止。可观察的表示异步数据流。因为您要将时间跨度传递给生成,所以数字生成是在后台线程中进行的
可观察的
表示异步数据流。因为您要将时间跨度传递给生成
,所以数字生成是在后台线程中进行的
当Main
函数退出时,主线程退出。当主线程退出时,后台线程被终止
由于Main
函数将在0.1秒之前退出,因此生成器没有时间生成任何内容。尝试添加Console.ReadLine()
到主
函数的末尾,因此后台线程在您按键之前不会被终止。可观察的
表示异步数据流。因为您要将时间跨度传递给生成
,所以数字生成是在后台线程中进行的
当Main
函数退出时,主线程退出。当主线程退出时,后台线程被终止
由于
Main
函数将在0.1秒之前退出,因此生成器没有时间生成任何内容。尝试添加Console.ReadLine()
到Main
函数的末尾,因此后台线程在您按键之前不会被终止。可能它没有时间生成任何内容。尝试添加Console.ReadLine()代码>结束。@Blorgbeard它现在可以工作了。原因是什么?我不熟悉Rx,但我假设它是在后台线程上执行的。当主线程退出时,后台线程被终止。当Main
函数结束时,主线程退出Console.ReadLine()
等待主线程上的输入,因此在您按键之前背景线程不会被终止。@blorgty。请复制答案,这样我就可以结束这个问题。如果您将您的可观测值保存在变量中,您还可以调用observable.Wait()
。它等待/阻塞,直到可观察的完成执行。也许它没有时间生成任何东西。尝试添加Console.ReadLine()代码>结束。@Blorgbeard它现在可以工作了。原因是什么?我不熟悉Rx,但我假设它是在后台线程上执行的。当主线程退出时,后台线程被终止。当Main
函数结束时,主线程退出Console.ReadLine()
等待主线程上的输入,因此在您按键之前背景线程不会被终止。@blorgty。请复制答案,这样我就可以结束这个问题。如果您将您的可观测值保存在变量中,您还可以调用observable.Wait()
。它等待/阻塞,直到可观察到的完成executing.Btw。如果有人使用Rx的定时功能,则数字生成仅在后台线程中运行。如果仅使用4个参数调用Observable.Generate,则不会创建任何后台线程,程序将在主线程上以无休止的循环运行。感谢Sid,这就是为什么我不愿意发布答案的原因-我想我会错过类似的内容。Observable
表示能够异步的发布/订阅源。与Node.js中的承诺和回调不同,可观察的
不一定是异步的。例如:Observable.Return
,甚至Observable.Generate
create synchronousObservable
s,许多Rx操作符还返回一个与它们所操作的源具有相同同步性的Observable。例如:Select
、SelectMany
、Aggregate
、Scan
、Count
,等等。但是,这些确实包括用于指定计划程序的重载,这可能会更改操作的同步性。@Christopherris感谢您的澄清。我刚才提到过,它非常强调asynchronisity.Btw。如果有人使用Rx的定时功能,则数字生成仅在后台线程中运行。如果仅使用4个参数调用Observable.Generate,则不会创建任何后台线程,程序将在主线程上以无休止的循环运行。感谢Sid,这就是为什么我不愿意发布答案的原因-我想我会错过类似的内容。Observable
表示能够异步的发布/订阅源。与Node.js中的承诺和回调不同,可观察的
不一定是异步的。例如:Observable.Return
,甚至Observable.Generate
create synchronousObservable
s,许多Rx操作符还返回一个与它们所操作的源具有相同同步性的Observable。例如:Select
、SelectMany
、Aggregate
、Scan
、Count
,等等。但是,这些确实包括用于指定计划程序的重载,这可能会更改操作的同步性。@Christopherris感谢您的澄清。我曾经提到过,它非常强调异步性。
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);
}