Chciałbym obsługiwać kolekcję równolegle, ale mam problemy z jej wdrożeniem i dlatego liczę na pomoc.
Problem pojawia się, jeśli chcę wywołać metodę oznaczoną jako asynchroniczna w C #, w obrębie lambda pętli równoległej. Na przykład:
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;
Problem występuje, gdy liczba wynosi 0, ponieważ wszystkie utworzone wątki są w rzeczywistości tylko wątkami w tle, a Parallel.ForEach
wywołanie nie czeka na zakończenie. Jeśli usunę słowo kluczowe async, metoda wygląda następująco:
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;
Działa, ale całkowicie wyłącza oczekiwaną spryt i muszę wykonać ręczną obsługę wyjątków ... (Usunięto dla zwięzłości).
Jak mogę zaimplementować Parallel.ForEach
pętlę, która używa słowa kluczowego await w lambdzie? Czy to możliwe?
Prototyp metody Parallel.ForEach przyjmuje Action<T>
parametr as, ale chcę, aby czekał na moją asynchroniczną lambdę.
await
zawait GetData(item)
drugiego bloku kodu, ponieważ spowodowałoby to błąd kompilacji w obecnej postaci.