В Rx при использовании Scheduler.NewThread для метода ObserveOn, в чем преимущество того, что каждый делегат Observation (OnNext) работает в новом потоке, когда Rx уже гарантирует, что OnNexts никогда не будет перекрываться. Если каждый OnNext будет вызываться один за другим, зачем нужен новый поток для каждого из них.
Я понимаю, почему нужно запускать делегаты наблюдения в потоке, отличном от потока подписки и приложения, но запускать каждый делегат наблюдения в новом потоке, когда они никогда не будут работать параллельно? .... не имеет смысла я или я что-то здесь упускаю?
Например
using System;
using System.Linq;
using System.Reactive.Concurrency;
using System.Reactive.Linq;
using System.Threading;
namespace RxTesting
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Application Thread : {0}", Thread.CurrentThread.ManagedThreadId);
var numbers = from number in Enumerable.Range(1,10) select Process(number);
var observableNumbers = numbers.ToObservable()
.ObserveOn(Scheduler.NewThread)
.SubscribeOn(Scheduler.NewThread);
observableNumbers.Subscribe(
n => Console.WriteLine("Consuming : {0} \t on Thread : {1}", n, Thread.CurrentThread.ManagedThreadId));
Console.ReadKey();
}
private static int Process(int number)
{
Thread.Sleep(500);
Console.WriteLine("Producing : {0} \t on Thread : {1}", number,
Thread.CurrentThread.ManagedThreadId);
return number;
}
}
}
Приведенный выше код дает следующий результат. Обратите внимание, что потребление выполняется в новом потоке каждый раз.
Application Thread : 8
Producing : 1 on Thread : 9
Consuming : 1 on Thread : 10
Producing : 2 on Thread : 9
Consuming : 2 on Thread : 11
Producing : 3 on Thread : 9
Consuming : 3 on Thread : 12
Producing : 4 on Thread : 9
Consuming : 4 on Thread : 13
Producing : 5 on Thread : 9
Consuming : 5 on Thread : 14
Producing : 6 on Thread : 9
Consuming : 6 on Thread : 15
Producing : 7 on Thread : 9
Consuming : 7 on Thread : 16
Producing : 8 on Thread : 9
Consuming : 8 on Thread : 17
Producing : 9 on Thread : 9
Consuming : 9 on Thread : 18
Producing : 10 on Thread : 9
Consuming : 10 on Thread : 19