Ich würde gerne eine Sammlung parallel behandeln, aber ich habe Probleme bei der Umsetzung und ich hoffe daher auf etwas Hilfe.Parallele foreach mit asynchronem Lambda
Der Fehler tritt auf, wenn ich eine Methode aufrufen möchte, die in C# async innerhalb des Lambda der parallelen Schleife markiert ist. Zum Beispiel:
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;
Das Problem tritt bei der Zählung 0 ist, weil alle erstellten Threads effektiv nur Hintergrund-Threads sind und der Parallel.ForEach
Anruf wartet nicht für die Fertigstellung. Wenn ich das Asynchron-Schlüsselwort zu entfernen, sieht das Verfahren wie folgt aus:
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;
Es funktioniert, aber es vollständig deaktiviert erwarten die Klugheit, und ich habe einige manuelle Ausnahmebehandlung zu tun .. (der Kürze halber entfernt).
Wie kann ich eine Parallel.ForEach
Schleife implementieren, die das Schlüsselwort wait innerhalb des Lambda verwendet? Ist es möglich?
Der Prototyp der Parallel.ForEach-Methode benötigt einen Action<T>
als Parameter, aber ich möchte, dass er auf mein asynchrones Lambda wartet.
Ich nehme an, Sie bedeuten 'await' zu entfernen' await GetData (Po) 'in Ihrem zweiten Codeblock als es einen Kompilierungsfehler als würde produzieren -ist. –
Mögliche Duplikate von [Nesting erwarten in Parallel.ForEach] (https://stackoverflow.com/questions/11564506/nesting-await-in-parallel-foreach) –