Я бы согласился с Асти.
Вы можете использовать Rx, чтобы заполнить очередь (блокирующую коллекцию), а затем сделать так, чтобы конкурирующие потребители читали из очереди.Таким образом, если один процесс по какой-то причине был быстрее, он мог бы забрать следующий элемент потенциально перед другим потребителем, если бы он все еще был занят.
Однако, если вы хотите сделать это, вопреки добрым советам :), тогдаВы можете просто использовать оператор Select, который предоставит вам индекс каждого элемента.Затем вы можете передать это своим подписчикам, и они могут соответствовать модулю.(Блин! Утечка абстракций, магические числа, потенциальная блокировка, потенциальные побочные эффекты для исходной последовательности и т. Д.)
var source = Obserservable.Interval(1.Seconds())
.Select((i,element)=>{new Index=i, Element=element});
var subscription1 = source.Where(x=>x.Index%2==0).Subscribe(x=>DoWithThing1(x.Element));
var subscription2 = source.Where(x=>x.Index%2==1).Subscribe(x=>DoWithThing2(x.Element));
Также помните, что работа, выполняемая с обработчиком OnNext, если он блокирует, все равно будет блокировать планировщикэто находится на.Это может повлиять на скорость вашего источника / производителя.Еще одна причина, почему ответ Асти является лучшим вариантом.
Спросите, если это не ясно: -)