【问题标题】:Rx in .Net 3.5 not Asynchronous?.Net 3.5 中的 Rx 不是异步的?
【发布时间】:2010-02-19 19:47:48
【问题描述】:

我正在使用 .Net3.5SP1 中的 Rx 并尝试使用 101 Rx Samples。我正在尝试第一个示例(开始 - 异步运行代码),但它似乎并没有真正异步运行。例如,

        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. 

但是当所谓的异步调用发生时,主线程被阻塞了。

【问题讨论】:

    标签: .net system.reactive reactive-programming


    【解决方案1】:

    这在我看来是合理的。

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

    如果您担心是因为 First() 返回值本身,而不是给出一种您可以稍后查阅的“未来”值,那是另一回事 - 我有两篇博文供您阅读:@987654321 @; part 2。我认为您想要Prune 方法,但我不完全确定。

    【讨论】:

    • 不,这不是问题...问题是事件的顺序。我原以为它会说 [Creating] [Created] [Starting] Calcuting... [Started] <...3 second wait...> Done。但是当所谓的异步调用发生时,主线程被阻塞了......
    • @kouPhax:First() 方法必须返回 值,不是吗? (诚​​然,在这种情况下,该值只是Unit,但仍然......)这意味着它无法完成,直到计算完成之后。基本上,计算正在异步进行,但 First() 调用等待它完成。评论明确表示:“//订阅并等待后台操作完成”
    【解决方案2】:

    // subscribe and wait for completion of background operation 行表示它等待后台操作完成。因此,您不会期望该行 (Console.WriteLine("[Started]");) 之后的代码在操作完成之前运行,对吧?

    【讨论】:

      【解决方案3】:

      首先是阻塞...订阅就是你想要的:

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

      【讨论】:

        猜你喜欢
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多