c# - 接收 : Difference between CurrentThreadScheduler and ImmediateScheduler

标签 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));

最佳答案

前几天有人问我这个问题,这促使我想出一个简单的例子。考虑以下安排一个操作的代码:

  • 安排另一个操作将2写到控制台
  • 然后将 1 写入控制台。

代码如下:

var scheduler = Scheduler.CurrentThread;

scheduler.Schedule(() => {
    scheduler.Schedule(() => Console.WriteLine(2));
    Console.WriteLine(1);
});

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

1
2

但是如果我们换成 Scheduler.Immediate,我们会得到:

2
1

为什么?那么 ImmediateScheduler 将在当前线程被调度后立即执行调度的操作。在这种情况下,我们看到即使我们正在执行计划的操作,ImmediateScheduler 也会立即调用新计划的操作。

相比之下,CurrentThreadScheduler 会将当前线程上的操作排队,并在当前执行的操作完成时执行(以及在任何其他排队的操作之后,如果有的话)。

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

关于c# - 接收 : Difference between CurrentThreadScheduler and ImmediateScheduler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24915290/

相关文章:

c# - 找不到 C# 程序集中的 Ghostscript 调用

c# - 如何在 .NET 中使用 Ruby 代码?

c# - 可从链式任务中观察到

c# - 响应式(Reactive) UI/响应式(Reactive)扩展 : how to clear ObservableAsPropertyHelper

c# - 具有依赖注入(inject)设计的处理程序工厂

c# - 存储库、工厂和层次结构数据

c# - 用于用户模板的 RazorEngine - 安全性?

c# - 响应式订阅在一段时间内没有跟随不同事件的事件

c# - 如何使用 Rx.Net 编写条件样本组合器

java - 如何正确组合streams\Observables