2011-02-07 2 views
1

Проблема:.Издатель/подписчик в LINQ?

IEnumerable<Signal> feed = GetFeed(); 

var average1 = feed.MovingAverage(10); 
var average2 = feed.MovingAverage(20); 

var zipped = average1.Zip(average2, (x,y) => Tuple.Create(x,y)); 

Когда я перебирать "на молниях", GetFeed() GetEnumerator() вызывается дважды, и создает все виды проблем синхронизации. Существует ли оператор LINQ, который может использоваться для передачи значений от одного производителя нескольким потребителям? Я знаю о Memoize, но в моем случае я не могу предсказать размер буфера, чтобы медленные и быстрые потребители «счастливы».

Я думаю о написании собственного оператора, который будет хранить отдельные очереди для каждого потребителя, но хотел бы проверить, существует ли существующее решение.

ответ

3

Что вы хотите, это Reactive Extensions. Это похоже на LINQ to Objects, но наоборот: вы не тянете значения, они толкнул через наблюдателей.

Требуется некоторое время, чтобы привыкнуть к нему, но, судя по тому, что вы опубликовали, это точно подходящая модель для вас.

+0

Да, я смотрю на Rx. В нем есть публикация(), которая охватывает этот сценарий. Но, к сожалению, есть другие проблемы, которые мешают мне полагаться на это на 100%. Потребуется некоторое время, чтобы привыкнуть к нему, что может создать проблемы с приближением других разработчиков. –

+0

@Serge: Вы всегда можете создать свой собственный эквивалент, как раз столько, сколько вам нужно - что может быть проще. Я сделал что-то подобное раньше; он был намного менее изящным, чем Rx, но мне было легче понять в то время :) –

+0

По иронии судьбы, после дня прототипирования я снова посмотрю на Rx. Модель Push выглядит более подходящей для моего сценария ... меньше блокировки –

Смежные вопросы