我正在通过解决随机问题并毫不羞耻地问一些愚蠢的新手问题来自学响应式编程。在弄清线程调度的工作原理时,我成功地使自己困惑了。虽然我相当确定这段代码没有逻辑意义,但我也不能理解其中发生了什么。想要理解可能会对我有所帮助。以下是代码:
var testScheduler = new TestScheduler();
var newThreadScheduler = new NewThreadScheduler();
var emitter = new Subject<string>();
testScheduler.Schedule(TimeSpan.FromSeconds(0.1), () => emitter.OnNext("one"));
testScheduler.Schedule(TimeSpan.FromSeconds(0.2), () => emitter.OnCompleted());
var subscription = emitter.SubscribeOn(newThreadScheduler)
.Subscribe(
item => Console.WriteLine(item),
error => Console.WriteLine(error),
() => Console.WriteLine("Complete!")
);
testScheduler.AdvanceBy(TimeSpan.FromSeconds(1).Ticks);
Console.WriteLine("DONE.");
Console.ReadLine();
我原本期望的是可能:
one
DONE.
Complete!
由于我不确定SubscribeOn()的作用,因此可能会有交错。但是我得到的结果是:
DONE.
Complete!
这里到底发生了什么?为什么项目在完成之前没有被生产出来?在这种情况下,ObserveOn()的工作方式符合我的预期,我也明白原因:它在其他线程上运行委托,并且它们可以与“DONE”交错。那么SubscribeOn()到底是做什么的呢?
newThreadScheduler
,但是所有的工作和计划都是针对testScheduler
触发的。 - TyCobb