Я относительно новичок в асинхронной обработке и экспериментирую с TPL Dataflow. Мой сценарий: у меня есть блок, который постоянно получает входные данные, асинхронно выполняет функцию на входе и возвращает результаты. (Результаты затем передаются в другой блок, который сохраняется в базе данных.) Функция может завершиться за миллисекунды или возврат может занять до 10 секунд. Блок настроен на обработку с «неограниченным» параллелизмом. Порядок результатов не имеет значения.
Я начал использовать TransformBlock
, но (поскольку он поддерживает последовательность элементов) один медленный элемент может вызвать скопление множества более быстрых элементов за ним. В этой конкретной ситуации не только допустимо, чтобы результаты распространялись вне последовательности, но и очень желательно. Это позволяет получать результаты с регулярной скоростью, а не гигантскими волнами.
Я искал несколько раз в поисках реализации блока потока данных, который распространяет элементы сразу после их завершения, но я еще не нашел ничего, что соответствовало бы этому описанию. Я сдался и создал свой собственный NonSequentialBlock
, "склеив изолентой" вместе ActionBlock
и BufferBlock
. Кажется, это работает, но меня беспокоит, что (из-за отсутствия опыта) я сделал что-то не так, и в конце концов это меня укусит. Доступна ли существующая реализация этого шаблона?