Я хотів би паралельно обробляти колекцію, але у мене виникають проблеми з її реалізацією, тому я сподіваюся на допомогу.
Проблема виникає, якщо я хочу викликати метод, позначений асинхронією в C #, в межах лямбда паралельного циклу. Наприклад:
var bag = new ConcurrentBag<object>();
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<object>();
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
цикл, який використовує ключове слово очікування в лямбда? Це можливо?
Прототип методу Parallel.ForEach приймає за Action<T>
параметр, але я хочу, щоб він зачекав мого асинхронного лямбда.
await
зawait GetData(item)
другого блоку коду, оскільки це призведе до помилки компіляції як є.