2010-02-19 70 views
5

我在.Net3.5SP1中使用Rx并尝试使用101 Rx Samples。我正在尝试第一个示例(开始 - 异步运行代码),但它似乎并不实际运行异步。例如,.net 3.5中的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] 

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

UPDATE

我还以为它会说

[Creating] 
[Created] 
[Starting] 
Calculating... 
[Started] 
    <...3 Second Wait...> 
Done. 

但是,尽管据说非同步调用发生在主线程被阻塞。

回答

1

这看起来合理地期待我。

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

如果您担心,因为First()返回值本身,而不是提供某种“未来”价值,您可以稍后再咨询,这是另一回事 - 我有两篇博客文章供您阅读:part 1; part 2。我认为你想Prune方法,但我不完全确定。

+0

不,这不是问题......问题是事件的顺序。我本来以为会说 [创建] [创建] [开始] 计算... [开始] <... 3秒的等待...> 完成。 但是,主线程被阻止,而据称异步调用发生... – 2010-02-19 20:03:54

+0

@kouPhax:First()方法必须*返回值,但是,不是吗? (在这种情况下,值只是'单位',但仍然...)这意味着它只能在*计算完成后才能完成。基本上,计算*是异步执行的,但First()调用等待它完成。该评论明确表示:“//订阅并等待后台操作完成” – 2010-02-19 20:13:40

+0

哈!假设我应该学会阅读!谢谢 – 2010-02-19 20:16:47

1

该行// subscribe and wait for completion of background operation表示它等待后台操作完成。所以你不会期望该行后面的代码(Console.WriteLine("[Started]");)运行直到操作完成,对吗?

1

首先被拦截...订阅是你想要什么:

 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(); 
    }