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

Jam*_*hes 5 .net reactive-programming system.reactive

我正在使用.Net3.5SP1中的Rx并尝试101 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]");
Run Code Online (Sandbox Code Playgroud)

输出

[Creating]
[Created]
[Starting]
Calculating...
    <...3 Second Wait...>
Done.
[Started]
Run Code Online (Sandbox Code Playgroud)

对此有解释吗?难道我做错了什么?这是预期的行为吗?

UPDATE

我本以为会说的

[Creating] 
[Created] 
[Starting] 
Calculating... 
[Started] 
    <...3 Second Wait...> 
Done. 
Run Code Online (Sandbox Code Playgroud)

但是,当所谓的Asynch调用发生时,主线程被阻塞.

Jon*_*eet 1

这在我看来是合理的预期。

如果你放一个Thread.Sleep在“创建”和“开始”之间进行调用,我想您会看到“计算”行出现,表明它在主线程运行时正在工作。这就是异步的方式。

如果您担心First()返回值本身,而不是提供一种您可以稍后查阅的“未来”值,那就是另一回事了 - 我有两篇博客文章供您阅读:第 1 部分;第1 部分第2部分。我你想要这个Prune方法,但我不完全确定。