Я хочу выполнить запрос по потоку данных при обработке элементов параллельно с определенной степенью parallelism. Обычно я использую PLINQ для этого, но мои рабочие элементы не связаны с ЦП, а связаны с IO. Я хочу использовать async IO. PLINQ не поддерживает работу async.
Какой самый умный способ запуска запроса в стиле PLINQ, но с асинхронными рабочими элементами?
Вот более подробная иллюстрация проблемы:
Моя цель - обработать потенциально бесконечный поток "элементов" способом, который логически описан следующим запросом:
var items = new int[10]; //simulate data
var results =
from x in items.AsParallel().WithDegreeOfParallelism(100)
where Predicate(x)
select ComputeSomeValue(x);
foreach (var result in results)
PerformSomeAction(result);
Этот запрос - всего лишь эскиз реального запроса. Теперь я хочу, чтобы каждая из функций-заполнителей была асинхронной (возвращала Task
и внутренне была основана на async IO).
Обратите внимание, что в памяти может быть гораздо больше элементов, чем может быть сохранено. Я также должен контролировать степень parallelism, чтобы максимизировать базовое сетевое и дисковое оборудование.
Этот вопрос не касается многоядерных процессоров. Он полностью применим к машинам с одним ядром ЦП, поскольку IO все еще может выиграть от parallelism. Подумайте о медленных вызовах веб-сервиса и т.п.