При попытке ограничить число степеней параллелизма, с которыми обрабатывается Observable, я обнаружил два метода:
var optimized =
observable
.OfType<IReadableGeometry>()
.Where(g => !(g is IOptimizedGeometry))
.Select(g => Observable.Defer(() => Observable.Start(g.Optimize)))
.Merge(10);
То есть сопоставление каждого элемента в последовательности с Observableи затем вызов Merge()
с максимальным аргументом параллелизма.
Или:
var scheduler = new LimitedConcurrencyLevelTaskScheduler(10);
var optimized =
observable
.OfType<IReadableGeometry>()
.Where(g => !(g is IOptimizedGeometry))
.ObserveOn(scheduler)
.Select(g => g.Optimize());
Они эквивалентны или есть разница в том, как они работают / ведут себя?