Parallele Verarbeitung mit asynchronen Lambda -Funktionen
kombiniertes Parallelverarbeitung und asynchrone Lambda -Funktionen erfordert sorgfältige Berücksichtigung. Dieser Artikel befasst sich mit den Herausforderungen der Verwendung von async
Methoden innerhalb von Parallel.ForEach
und bietet effektive Lösungen.
Das Problem mit parallel.foreach und asynchrisch Lambdas
Parallel.ForEach
startet Hintergrund -Threads, die nicht inhärent auf den Abschluss der Aufgaben warten. Dies schafft Probleme, wenn Sie await
innerhalb des Lambda -Ausdrucks verwenden. Das folgende Beispiel zeigt dieses Problem:
var bag = new ConcurrentBag<object>(); Parallel.ForEach(myCollection, async item => { // some pre-processing var response = await GetData(item); bag.Add(response); // some post-processing }); var count = bag.Count; // count will be 0
Der count
wird 0 sein, da der Haupt -Thread die Ausführung fortsetzt, bevor die Hintergrund -Threads ihre asynchronen Operationen abschließen. Verwenden Sie Wait()
als Problemumgehung, wie unten gezeigt, die Vorteile von await
und erfordert explizite Ausnahmeberechnung:
var bag = new ConcurrentBag<object>(); Parallel.ForEach(myCollection, item => { // some pre-processing var responseTask = GetData(item); responseTask.Wait(); var response = responseTask.Result; bag.Add(response); // some post-processing }); var count = bag.Count;
Lösung mit Task.whenall
Eine effizientere Lösung besteht darin, die asynchronen Operationen zu nutzen: Task.WhenAll
var bag = new ConcurrentBag<object>(); var tasks = myCollection.Select(async item => { // some pre-processing var response = await GetData(item); bag.Add(response); // some post-processing }); await Task.WhenAll(tasks); var count = bag.Count; // count will be correct
stellt sicher
Task.WhenAll
Erforschen Sie den Blog -Beitrag von Stephen Toub auf
. Dies liefert eine robuste und flexible Lösung für den Umgang mit komplexen Szenarien.Das obige ist der detaillierte Inhalt vonWie kann ich asynchrone Lambda -Funktionen mit parallel.foreach richtig verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!