我是RX的新手并且正在玩一些样本,关于为什么没有调用Subscribe中的Console.writeLine的任何想法?
var obs = 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 :(得分:4)
正如我所提到的,SubscribeOn
和ObserveOn
不是最有名的方法;我强烈建议一直阅读:
基本上,SubscribeOn
告诉系统执行实际的订阅/取消订阅接线的上下文,而ObserveOn
告诉系统要执行哪些上下文"执行"当新值到达源头时。
首先,请允许我稍微调整一下你的例子:
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