我是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)
行一切都好吗?
谢谢
最佳答案
如前所述,SubscribeOn
和ObserveOn
并不是最佳命名的方法;我强烈建议您通读以下内容:
http://blogs.msdn.com/b/rxteam/archive/2009/11/21/observable-context-observable-subscribeon-and-observable-observeon.aspx
基本上,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
关于c# - RX ObserveOn问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16382312/