C# 反应式扩展线程块

C# 反应式扩展线程块,c#,reactive,C#,Reactive,我试图弄清楚如何使用反应式扩展,为此我编写了以下简单示例: namespace ReactiveTest { class Program { static void Main(string[] args) { var o = Observable.Generate(0, i => i < 10, x => AddAndWait(x), i => i * i); Console.

我试图弄清楚如何使用反应式扩展,为此我编写了以下简单示例:

namespace ReactiveTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var o = Observable.Generate(0, i => i < 10, x => AddAndWait(x), i => i * i);
            Console.WriteLine("Before");
            o.Subscribe(x => Console.WriteLine(x));
            Console.WriteLine("After");
            Console.ReadLine();
        }

        static int AddAndWait(int i)
        {
            Thread.Sleep(1000);
            return i + 1;
        }
    }
}
namespace-ReactiveTest
{
班级计划
{
静态void Main(字符串[]参数)
{
var o=可观察的.Generate(0,i=>i<10,x=>AddAndWait(x),i=>i*i);
控制台。写入线(“之前”);
o、 订阅(x=>Console.WriteLine(x));
控制台。写入线(“之后”);
Console.ReadLine();
}
静态int AddAndWait(int i)
{
睡眠(1000);
返回i+1;
}
}
}
观看之后,我希望看到
After
打印在
After
之后,但我得到的是数字的平方,只有在完成之后,我才能得到
After
消息


我知道我正在阻止线程,但这不是反应性的东西的意义所在,能够超越这些限制并在主线程中继续吗?

反应性扩展的意义在于对事件的实时流做出反应并进行处理。在这种情况下,您正在同一线程上生成anc消费事件。默认情况下,被动扩展不为两个作业使用新线程。您可以使用
SubscribeOn
指定处理将在一个单独的线程上运行,或使用
ObserveOn
指定生成将在另一个线程上发生。重复问题的可能重复以及相关问题解释了这是如何工作的。这些答案也解释了为什么默认情况下,Reactive不并发。你知道我链接的视频是否在这个日期过期了吗?有几种方法,比如我们生成时间,我再也看不到了。默认情况下,2010年的视频已经过时了。我不认为Rx在那时有一个稳定的版本。但在异步和并发方面没有任何变化。在本例中,您试图在同一个阻塞线程上生成和使用事件。如果不使用
Thread.Sleep
和同样阻塞的
ReadLine
,您也可以这样做。例如,如果使用了
wait Task.Delay(…)
在Winforms应用程序中,您会得到不同的结果被动扩展的目的是响应和处理实时事件流。在这种情况下,您正在同一线程上生成anc消费事件。默认情况下,被动扩展不为两个作业使用新线程。您可以使用
SubscribeOn
指定处理将在一个单独的线程上运行,或使用
ObserveOn
指定生成将在另一个线程上发生。重复问题的可能重复以及相关问题解释了这是如何工作的。这些答案也解释了为什么默认情况下,Reactive不并发。你知道我链接的视频是否在这个日期过期了吗?有几种方法,比如我们生成时间,我再也看不到了。默认情况下,2010年的视频已经过时了。我不认为Rx在那时有一个稳定的版本。但在异步和并发方面没有任何变化。在本例中,您试图在同一个阻塞线程上生成和使用事件。如果不使用
Thread.Sleep
和同样阻塞的
ReadLine
,您也可以这样做。例如,如果使用了
wait Task.Delay(…)
在Winforms应用程序中,您会得到不同的结果