.net Net 3.5中的Rx不是异步的?

.net Net 3.5中的Rx不是异步的?,.net,system.reactive,reactive-programming,.net,System.reactive,Reactive Programming,我正在玩.Net3.5SP1中的Rx,并尝试使用。我正在尝试第一个示例(异步启动-运行代码),但它似乎没有实际异步运行。比如说, Console.WriteLine("[Creating]"); var o = Observable.Start(() => { Console.WriteLine("Calculating..."); Thread.Sleep(3000);

我正在玩.Net3.5SP1中的Rx,并尝试使用。我正在尝试第一个示例(异步启动-运行代码),但它似乎没有实际异步运行。比如说,

        Console.WriteLine("[Creating]");
        var o = Observable.Start(() => 
        {
            Console.WriteLine("Calculating..."); 
            Thread.Sleep(3000); 
            Console.WriteLine("Done."); 
        });
        Console.WriteLine("[Created]");
        Console.WriteLine("[Starting]");
        o.First();   // subscribe and wait for completion of background operation
        Console.WriteLine("[Started]");
输出

[Creating]
[Created]
[Starting]
Calculating...
    <...3 Second Wait...>
Done.
[Started]
[创建]
[已创建]
[开始]
精明的。。。
完成。
[开始]
对此有何解释?我做错什么了吗?这是预期的行为吗

更新

我本以为它会说

[Creating] 
[Created] 
[Starting] 
Calculating... 
[Started] 
    <...3 Second Wait...> 
Done. 
[创建]
[已创建]
[开始]
精明的。。。
[开始]
完成。

但是当假定的异步调用发生时,主线程被阻塞。

这在我看来是合理的

如果将
Thread.Sleep
调用放在“Created”和“start”之间,我想您会看到“computing”行出现,显示它在主线程运行时正在工作。这就是异步的方式


如果您担心的是
First()
返回值本身,而不是提供一种“未来”值供您稍后参考,那是另一回事-我有两篇博文供您阅读:。我想您需要
Prune
方法,但我不能完全确定。

//订阅并等待后台操作完成
表示它等待后台操作完成。因此,在操作完成之前,您不会期望该行(
Console.WriteLine(“[Started]”;
)后面的代码运行,对吗?

首先是阻塞。。。订阅是您想要的:

        public static void Main(string[] args) {

        Console.WriteLine("[Creating]");
        var o = Observable.Start(() =>
        {
            Console.WriteLine("Calculating...");
            Thread.Sleep(3000);

        });
        Console.WriteLine("[Created]");
        Console.WriteLine("[Starting]");

        o.Subscribe(_ => Console.WriteLine("Done."));   // subscribe and wait for completion of background operation 

        Console.WriteLine("[Started]");

        Console.ReadKey();
    }

不,这不是问题所在。。。问题在于事件的顺序。我本以为它会说[创造][创造][开始]计算。。。[开始]完成。但是当假定的异步调用发生时,主线程被阻塞…@kouPhax:First()方法必须返回值,不是吗?(无可否认,在这种情况下,该值仅为
Unit
,但仍然是…)这意味着在计算完成之前,它无法完成。基本上,计算是异步进行的,但第一个()调用将等待它完成。注释明确表示://订阅并等待后台操作完成