正如我所提到的,SubscribeOn
和ObserveOn
不是最好的方法;我强烈建议通过阅读这一切的方式:
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
现在,让我们换线程我们ObserveOn
和SubscribeOn
:
.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
那么*当前线程是什么?你在做什么来让调度器在当前线程上运行它的任务?这是一个控制台应用程序? – 2013-05-05 07:34:51
当前线程将成为订阅所在的线程,因此Scheduler.TaskPool线程。这是在一个WPF应用程序 – Andy 2013-05-05 11:56:38
'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