Heim > Backend-Entwicklung > C++ > Wie kann ich asynchrone Lambda -Funktionen mit parallel.foreach richtig verwenden?

Wie kann ich asynchrone Lambda -Funktionen mit parallel.foreach richtig verwenden?

Barbara Streisand
Freigeben: 2025-02-01 03:31:08
Original
1043 Leute haben es durchsucht

How Can I Properly Use Asynchronous Lambda Functions with Parallel.ForEach?

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
Nach dem Login kopieren

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;
Nach dem Login kopieren

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
Nach dem Login kopieren
Mit diesem Ansatz kann jedes Element asynchron verarbeitet werden, und

stellt sicher Task.WhenAll

Erweiterte Lösung: foreachasync

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage