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
Barbara StreisandOriginal
2025-02-01 03:31:081091Durchsuche

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:

<code class="language-csharp">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</code>

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:

<code class="language-csharp">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;</code>

Lösung mit Task.whenall

Eine effizientere Lösung besteht darin, die asynchronen Operationen zu nutzen: Task.WhenAll

<code class="language-csharp">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</code>
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!

Stellungnahme:
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