C# Rx:CurrentThreadScheduler和ImmediateScheduler之间的差异

C# Rx:CurrentThreadScheduler和ImmediateScheduler之间的差异,c#,system.reactive,C#,System.reactive,有人能描述一下currentThreadScheduler和ImmediateScheduler之间的区别吗?对于下面的代码,我看不出有什么不同 var rates = new List<FxRates>() { new FxRates() {CurrencyPair = "USD/GBP", BidPrice = 2.01m, AskPrice = 2.00m}, new FxRates() {Curr

有人能描述一下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));
var rates=新列表()
{
新的FxRates(){CurrencyPair=“USD/GBP”,投标价格=201万美元,AskPrice=200万美元},
新的FxRates(){CurrencyPair=“USD/Eur”,投标价格=130万美元,AskPrice=131万美元},
新的FxRates(){CurrencyPair=“英镑/欧元”,投标价格=80万英镑,AskPrice=81万英镑}
};
var observable=rates.Toobbservable(ImmediateScheduler.Instance)//更改为CurrentThreadScheduler
可观察。订阅(
rate=>Console.WriteLine(“ThreadId:{0},IsBackground:{1},CurrencyPair:{2}”,
Thread.CurrentThread.ManagedThreadId、Thread.CurrentThread.IsBackground、rate.CurrencyPair);

使用ImmerdiateScheduler,操作将立即执行。 使用CurrentThreadScheduler,它将在当前线程上执行,但可能稍后执行:该操作将添加到队列中


前几天有人问我这个问题,这促使我想出一个简单的例子。考虑下面的代码来调度一个动作:

  • 安排另一个操作将
    2
    写入控制台
  • 然后将
    1
    写入控制台
代码如下:

var scheduler = Scheduler.CurrentThread;

scheduler.Schedule(() => {
    scheduler.Schedule(() => Console.WriteLine(2));
    Console.WriteLine(1);
});
那么输出是什么呢?好的,通过
调度程序.CurrentThread
我们可以得到:

1
2
2
1
但是如果我们换成
调度程序.Immediate
我们会得到:

1
2
2
1
为什么??好的,
ImmediateScheduler
将在当前线程上执行调度操作。在本例中,我们可以看到,即使我们正在执行一个预定操作的中途,
ImmediateScheduler
将立即调用新的预定操作

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

CurrentThreadScheduler
在避免死锁方面特别有用,因为在任何给定时间只执行一个计划的操作,从而避免了
ImmediateScheduler
的嵌套效应。同样,它也避免了建立深层堆栈。

+1一张图片(或代码示例)相当于1000个单词。为了澄清,当他们说“当前线程”时,他们指的是源线程(调用OnNext的地方)还是订阅线程(调用Subscribe的地方?)。我想它的意思是叫OnNext的地方,但我不确定。