Ich möchte eine Sammlung parallel bearbeiten, habe jedoch Probleme bei der Implementierung und hoffe daher auf Hilfe.
Das Problem tritt auf, wenn ich eine in C # als asynchron gekennzeichnete Methode innerhalb des Lambda der Parallelschleife aufrufen möchte. Beispielsweise:
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 auf, wenn die Anzahl 0 ist, da alle erstellten Threads praktisch nur Hintergrund-Threads sind und der Parallel.ForEach
Aufruf nicht auf den Abschluss wartet. Wenn ich das asynchrone Schlüsselwort entferne, sieht die Methode folgendermaßen 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 deaktiviert die erwartete Klugheit vollständig und ich muss einige manuelle Ausnahmebehandlungen durchführen. (Der Kürze halber entfernt).
Wie kann ich eine Parallel.ForEach
Schleife implementieren , die das Schlüsselwort await im Lambda verwendet? Ist es möglich?
Der Prototyp der Parallel.ForEach-Methode verwendet einen Action<T>
as-Parameter, möchte jedoch, dass er auf mein asynchrones Lambda wartet.
await
ausawait GetData(item)
in Ihrem zweiten Codeblock als würde es einen Übersetzungsfehler erzeugen , wie sie ist.