在 Rx .NET 中计划



预期全部在 .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)

相关内容

  • 没有找到相关文章

最新更新