Это помогло мне понять это, подумав о SubscribeOn
как о настройке потока, «проходящего вверх» по цепочке, и ObserveOn
о настройке потока, «проходящего вниз» по цепочке.
![Subscriber thread](https://i.stack.imgur.com/tQf6H.jpg)
В приведенном ниже коде используются именованные потоки, с которыми вы можете играть.
Thread.CurrentThread.Name = "Main";
IScheduler thread1 = new NewThreadScheduler(x => new Thread(x) { Name = "Thread1" });
IScheduler thread2 = new NewThreadScheduler(x => new Thread(x) { Name = "Thread2" });
Observable.Create<int>(o =>
{
Console.WriteLine("Subscribing on " + Thread.CurrentThread.Name);
o.OnNext(1);
return Disposable.Create(() => {});
})
.SubscribeOn(thread1)
.ObserveOn(thread2)
.Subscribe(x => Console.WriteLine("Observing '" + x + "' on " + Thread.CurrentThread.Name));
Вывод вышеуказанного:
Subscribing on Thread1
Observing 1 on Thread2
Также интересно видеть, что когда вы закомментируете строку SubscribeOn
, вы получите:
Subscribing on Main
Observing 1 on Thread2
Поскольку по умолчанию подписка «проходит»up ", какой бы поток ни работал (Main
здесь).Тогда ObserveOn
«пропускает» Thread2
.
Если вместо этого вы закомментируете строку ObserveOn
, вы получите:
Subscribing on Thread1
Observing 1 on Thread1
Потому чтомы «пропускаем» подписку на Thread1
, и по умолчанию этот же поток «пропускается» и используется для запуска наблюдения.
В контексте графического интерфейса, чтобы держать вещи отзывчивыми, вы хотите наименьшее количествоработы, выполненной в потоке графического интерфейса, но вам нужна подписка, выполненная в потоке графического интерфейса пользователя (для синхронизации обновлений пользовательского интерфейса).Итак, вы хотите. Наблюдать за потоком GUI.