2017-01-13 5 views
1

У меня есть процесс, для которого мне нужно улучшить производительность.Будет ли это хорошим кандидатом на реактивные расширения?

Этот процесс запускает запрос в базе данных.

Для каждой записи есть две задачи, которые, возможно, необходимо выполнить на основе данных в записи.

Для одной из двух задач, возможно, потребуется дополнительная информация из веб-службы, тогда обработка будет точно такой же.

Другая задача всегда одна и та же.

Как только обе задачи выполнены, запись должна быть обновлена ​​в базе данных.

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

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

IObservable<Record> records = GetDataFromDb().ToObservable(); 

var recsOfType1 = records.Where(r => r.IsOfType1).Do(FetchAdditionalInfoIntoRecord); 
var recsOfType2 = records.Where(r => r.IsOfType2); 

var allCompleteRecords = recsOfType1.Merge(recsOfType2); 

allCompleteRecords.Do(Task1).Do(Task2).Do(UpdateInDB); 

Мне нужно будет добавить дополнительную обработку ошибок и мониторинг процесса. Я не уверен на 100%, как бы я это сделал.

Любые идеи/комментарии/критики приветствуются.

Thanks

+3

№ RX предназначен для «управления» потоками событий. Поэтому обрабатывать данные, которые выталкиваются. Запросы БД касаются вытягивания данных. Вместо этого я предлагаю рассмотреть задачи. –

+0

Rx перебор. Задача должна помочь здесь – Tilak

+0

Я согласен со всеми комментариями, что это не проблема Rx. Но также хотел бы добавить «не использовать' Do', как это ». Если у вас есть наблюдаемая последовательность данных, используйте «Выбрать», чтобы внести изменения в данные, а _pipe_ - к следующему оператору. Не используйте для 'Do', который должен почти исключительно быть отнесен к регистрации и отладке. –

ответ

1

Как упоминалось в комментариях, Rx лучше всего подходит для потоковых потоков. Все эти задачи основаны на тяге. Если вы считаете, что стандартные задачи не сокращают его, я бы рекомендовал TPL-Dataflow.

1

Запросы базы данных, файлы, реестры и т. Д. Основаны на pull-based (Enumerable), в отличие от push-based (Observable). Вместо Reactive Extensions вы можете использовать Interactive Extensions (System.Interactive) - они содержат большинство эквивалентных методов в Rx, но являются pull-based.

Перечислимые генераторы позволяют писать совместные подпрограммы (через yield) и являются мощным композиционным инструментом. Если вы хотите асинхронно, вы можете просто перечислить перечисление в Задачи.

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