Параллельный foreach с асинхронной лямбда-выражениемC#

Место общения программистов C#
Anonymous
Параллельный foreach с асинхронной лямбда-выражением

Сообщение Anonymous »

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

Проблема возникает, если я хочу вызвать метод, помеченный как async в C#, внутри лямбда-выражения параллельного цикла. Например:

Код: Выделить всё

var bag = new ConcurrentBag();
Parallel.ForEach(myCollection, async item =>
{
// some pre stuff
var response = await GetData(item);
bag.Add(response);
// some post stuff
}
var count = bag.Count;
Проблема возникает, когда счетчик равен 0, поскольку все созданные потоки фактически являются просто фоновыми потоками, а вызов Parallel.ForEach не ожидает завершения. Если я удалю ключевое слово async, метод будет выглядеть так:

Код: Выделить всё

var bag = new ConcurrentBag();
Parallel.ForEach(myCollection, item =>
{
// some pre stuff
var responseTask = await GetData(item);
responseTask.Wait();
var response = responseTask.Result;
bag.Add(response);
// some post stuff
}
var count = bag.Count;
Он работает, но полностью отключает функцию ожидания, и мне приходится вручную обрабатывать исключения. (Удалено для краткости).

Как реализовать цикл Parallel.ForEach, который использует ключевое слово await в лямбда-выражении? Возможно ли это?

Прототип метода Parallel.ForEach принимает Action в качестве параметра, но я хочу, чтобы он ждал мою асинхронную лямбду.

Вернуться в «C#»