Rx: разница между CurrentThreadScheduler и ImmediateScheduler

1

Может ли кто-нибудь описать разницу между 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));
Теги:
system.reactive

2 ответа

3
Лучший ответ

С помощью ImmerdiateScheduler действие выполняется немедленно. С CurrentThreadScheduler он будет выполняться в текущем потоке, но может быть выполнен позже: действие добавляется в очередь.

CurrentThreadScheduler vs ImmediateScheduler

  • 0
    Чтобы уточнить, когда они говорят «текущий поток», они ссылаются на исходный поток (где вызывается OnNext) или поток подписки (где вызывается Subscribe?). Я думаю, что это означает, где OnNext вызывается, но я не уверен.
5

Кто-то спросил меня об этом на днях, и это побудило меня привести простой пример. Рассмотрим следующий код, который планирует действие, которое:

  • Планирует другое действие, чтобы выписать 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 очередь действие в текущем потоке и будет выполнено, когда текущее выполняемое действие завершится (и после любых других действий в очереди, если они есть).

CurrentThreadScheduler может быть особенно полезен во избежание взаимоблокировок, поскольку в любой момент времени будет выполняться только одно запланированное действие, избегая эффекта вложенности ImmediateScheduler. Кроме того, он также избегает создания глубоких стеков.

  • 0
    +1 Картинка (или пример кода) стоит 1000 слов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню