为什么不是这个代码表现异步

问题描述:

据我所知,订阅方法应该是异步的,而运行是同步的。但是这段代码是以同步方式工作的。任何人都可以修复它吗?为什么不是这个代码表现异步

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Reactive.Linq; 

namespace RxExtensionsDemo 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      IObservable<int> source = Observable.Generate<int, int>(0, i => i < 10000, i => i + 1, i => i * i); 

      IDisposable subscription = source.Subscribe(x => { Console.WriteLine("Received {0} from source", x); }, ex => 
      { 
       Console.WriteLine("Error occured"); 

      },() => 
      { 
       Console.WriteLine("Source said there are no more messages to follow"); 
      }); 

      Console.WriteLine("Asynchronous"); 

      Console.ReadKey(); 
     } 
    } 
} 

我总是看到异步写入控制台在最后。

+0

我不认为'Subscribe'始终是异步的。 – CodesInChaos

+0

并且即使它不能保证一个线程在任何特定时间产生 –

+0

我想我所缺少的是指定Scheduler选项:Scheduler.ThreadPool作为最后一个。指定完成了这项工作:) – Jaggu

默认情况下Observable.Generate使用Scheduler.CurrentThread。但是,您可以指定不同的调度,以获得所需的异步行为:

IObservable<int> source = Observable.Generate<int, int>(
    0, 
    i => i < 10000, 
    i => i + 1, 
    i => i * i, 
    Scheduler.NewThread 
); 

Scheduler类是在System.Reactive.Concurrency命名空间。

其他可能的异步预定义调度程序是Scheduler.TaskPoolScheduler.ThreadPool