2013-05-05 45 views
2

我是RX的新手,玩弄了一些示例,关于为什么Console.writeLine在Subscribe中没有被调用的想法?RX ObserveOn issue

变种观测值= Observable.Create(I => {

   while(true) 
      { 
       Thread.Sleep(250); 

       i.OnNext(2.0); 
      } 



      return() => { }; 
     })   
     .SubscribeOn(Scheduler.TaskPool) 
     .ObserveOn(Scheduler.CurrentThread) 
     .Subscribe(i => 
     { 
      Console.WriteLine("Inside Subscribe"); 
     }); 

如果删除了

.ObserveOn(Scheduler.CurrentThread) 

线所有的罚款?

由于

+0

那么*当前线程是什么?你在做什么来让调度器在当前线程上运行它的任务?这是一个控制台应用程序? – 2013-05-05 07:34:51

+0

当前线程将成为订阅所在的线程,因此Scheduler.TaskPool线程。这是在一个WPF应用程序 – Andy 2013-05-05 11:56:38

+0

'ObserveOn'和'SubscribeOn'可能会相当混乱 - 我强烈建议阅读此:http://blogs.msdn.com/b/rxteam/archive/2009/11/21/observable-context -observable-subscribeon-and-observable-observeon.aspx – JerKimball 2013-05-05 18:19:06

回答

4

正如我所提到的,SubscribeOnObserveOn不是最好的方法;我强烈建议通过阅读这一切的方式:

http://blogs.msdn.com/b/rxteam/archive/2009/11/21/observable-context-observable-subscribeon-and-observable-observeon.aspx

基本上,SubscribeOn告诉系统什么情况下做实际订阅/退订的布线,而ObserveOn告诉系统什么情况下,以“EXECUTE AS”的时候新的价值来源。

首先,请允许我来调整你的例子有点:

Console.WriteLine("Start Thread ID:{0}", Thread.CurrentThread.ManagedThreadId); 
var subscription = Observable.Create<double>(i => 
    { 
     Console.WriteLine("Observable thread ID:{0}", Thread.CurrentThread.ManagedThreadId); 
     while(true) 
     { 
      Console.WriteLine("Pushing values from thread {0}", Thread.CurrentThread.ManagedThreadId); 
      Thread.Sleep(250);    
      i.OnNext(2.0); 
     } 
     return() => { }; 
    })   
    .SubscribeOn(Scheduler.TaskPool) 
    .ObserveOn(Scheduler.CurrentThread) 
    .Subscribe(i => 
    { 
     Console.WriteLine("Subscribable thread ID:{0}", Thread.CurrentThread.ManagedThreadId); 
     Console.WriteLine("Inside Subscribe"); 
    });  
Console.ReadLine(); 
subscription.Dispose(); 

如果你运行它,你会看到类似这样的:

Start Thread ID:21 
Observable thread ID:23 
Pushing values from thread 23 
Pushing values from thread 23 
Pushing values from thread 23 
Pushing values from thread 23 

现在,让我们换线程我们ObserveOnSubscribeOn

.SubscribeOn(Scheduler.CurrentThread) 
.ObserveOn(Scheduler.TaskPool) 

现在,我们得到:

Start Thread ID:26 
Observable thread ID:26 
Pushing values from thread 26 
Pushing values from thread 26 
Subscribable thread ID:27 
Inside Subscribe 
Pushing values from thread 26 
Subscribable thread ID:27 
Inside Subscribe 
Pushing values from thread 26 
Subscribable thread ID:27 
Inside Subscribe