2014-12-11 2 views
2

Я относительно новичок в асинхронной обработке и экспериментировании с потоком данных TPL. Мой сценарий: у меня есть блок, который постоянно снабжается входом, асинхронно выполняет функцию на входе и возвращает результаты. (Затем результаты передаются в другой блок, который сохраняется в базе данных.) Функция может быть завершена в течение миллисекунд или может занять до 10 секунд. Блок настроен для обработки с «неограниченным» параллелизмом. Заказ результатов не имеет значения.Есть ли блок потока данных, такой как TransformBlock <TIn, TOut>, который позволяет размножать элементы в последовательности?

Я начал с использования TransformBlock, но (поскольку он поддерживает последовательность элементов), один медленный элемент приведет к тому, что за ним будут накапливаться более быстрые предметы. В этой конкретной ситуации не только приемлемо, чтобы результаты распространялись вне последовательности, но весьма желательны. Это позволяет получать результаты с регулярной скоростью, а не в гигантских волнах.

Я искал несколько раз, ища реализацию блока потока данных, который распространяет элементы, как только они будут завершены, но мне еще предстоит найти что-либо, что соответствует этому описанию. Я сдался и создал свой собственный «воздуховодом» вместе ActionBlock и BufferBlock. Кажется, эта работа, но я обеспокоен тем, что (в моем отсутствии опыта) я сделал что-то не так, и это укусит меня в конце. Существует ли существующая реализация этой модели?

+1

Записи ActionBlock в буферном блоке? – i3arnon

+0

@ I3arnon Это правильно. –

ответ

2

Нет, вы не сделали ничего плохого. Типично создавать свои собственные блоки, объединяя основные блоки, а затем вызывая Encapsulate, чтобы ... инкапсулировать их и представить один блок IPropagator.

+0

Это должно работать отлично. Я понятия не имел, что существует метод Encapsulate. Благодаря! –