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)
前几天有人问过我,这促使我想出一个简单的例子.请考虑以下用于调度以下操作的代码:
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.出于同样的原因,它也避免了构建深层堆栈.