预期全部在 .NET Core 2.0 控制台应用的主线程上执行,因此输出被阻止 10 秒:
static void Main(string[] args)
{
WriteLine($"We are on {Thread.CurrentThread.ManagedThreadId}");
var subject = new Subject<long>();
var subscription = subject.Subscribe(
i => WriteLine($"tick on {Thread.CurrentThread.ManagedThreadId}"));
var timer = Observable.Interval(TimeSpan.FromSeconds(1))
.SubscribeOn(Scheduler.CurrentThread)
.Subscribe(i => subject.OnNext(i));
Thread.Sleep(10000);
}
但事实并非如此 - 每隔一秒就会有一行新行被随机线程调度到控制台:
We are on 1 tick on 4 tick on 5 tick on 4 tick on 4 tick on 4 tick on 4 tick on 4 tick on 4 tick on 5
我做错了什么?
Scheduler.CurrentThread
/CurrentThreadScheduler
将在调用 schedule 的同一线程上排队项目,该线程将是计时器碰巧运行的线程。调用Scheduler.CurrentThread
不会将通过它调度的项目的执行固定到您调用Scheduler.CurrentThread
的线程,而是将调用.Schedule()
的线程固定。
此外,您调用SubscribeOn()
这只会影响将进行.Subscribe()
调用的线程。如果要控制项目处理的执行,则宁愿调用.ObserveOn()
。
如果您希望所有内容都在主线程上运行,我建议通过在可观察的间隔上指定调度器在主线程上运行计时器:
Observable.Interval(TimeSpan.FromSeconds(1), Scheduler.CurrentThread)