Rx:CurrentThreadScheduler和ImmediateScheduler之间的区别

Hun*_*ter 1 c# system.reactive

有谁能描述currentThreadScheduler和ImmediateScheduler之间的区别?对于下面的代码,我看不出它有什么不同?

        var rates = new List<FxRates>()
        {
            new FxRates() {CurrencyPair = "USD/GBP", BidPrice = 2.01m, AskPrice = 2.00m},
            new FxRates() {CurrencyPair = "USD/Eur", BidPrice = 1.3m, AskPrice = 1.31m},
            new FxRates() {CurrencyPair = "GBP/Eur", BidPrice = .8m, AskPrice = .81m}
        };

        var observable = rates.ToObservable(ImmediateScheduler.Instance);//Change to CurrentThreadScheduler
        observable.Subscribe(
            rate => Console.WriteLine("ThreadId:{0}, IsBackground:{1}, CurrencyPair:{2}",
                Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsBackground, rate.CurrencyPair));
Run Code Online (Sandbox Code Playgroud)

Jam*_*rld 7

前几天有人问过我,这促使我想出一个简单的例子.请考虑以下用于调度以下操作的代码:

  • 安排另一个操作写出2到控制台
  • 然后写出1到控制台.

这是代码:

var scheduler = Scheduler.CurrentThread;

scheduler.Schedule(() => {
    scheduler.Schedule(() => Console.WriteLine(2));
    Console.WriteLine(1);
});
Run Code Online (Sandbox Code Playgroud)

那么输出是什么?好吧,Scheduler.CurrentThread我们得到:

1
2
Run Code Online (Sandbox Code Playgroud)

但是如果我们换掉Scheduler.Immediate我们得到的:

2
1
Run Code Online (Sandbox Code Playgroud)

为什么?那么一旦ImmediateScheduler安排好,它将在当前线程上执行预定的操作.在这种情况下,我们看到即使我们在执行预定的操作中途,ImmediateScheduler也会立即调用新安排的操作.

相反,CurrentThreadScheduler将在当前线程上对操作进行排队,并且当当前正在执行的操作完成时(以及在任何其他排队操作之后,如果有),它将被执行.

CurrentThreadScheduler对于避免死锁特别有用,因为在任何给定时间只执行一个预定动作,从而避免了嵌套效应ImmediateScheduler.出于同样的原因,它也避免了构建深层堆栈.