Heim >Backend-Entwicklung >C++ >Können asynchrone Vorgänge mit ForEach verwendet werden und was ist die beste Alternative?

Können asynchrone Vorgänge mit ForEach verwendet werden und was ist die beste Alternative?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-05 18:41:40403Durchsuche

Can Async Operations Be Used with ForEach, and What's the Best Alternative?

Verwendung von Async in ForEach

Frage:

Ist es möglich, Async-Funktionalität im Kontext von ForEach einzusetzen? Unten finden Sie einen Codeausschnitt, der die versuchte Implementierung darstellt:

using (DataContext db = new DataLayer.DataContext())
{
    db.Groups.ToList().ForEach(i => async {
        await GetAdminsFromGroup(i.Gid);
    });
}

Bei der Ausführung tritt jedoch der folgende Fehler auf:

The name 'Async' does not exist in the current context

Beachten Sie, dass die Methode, die die using-Anweisung kapselt, angegeben wurde als asynchron.

Antwort:

Die Implementierung von ForEach, beschäftigt bei List ist nicht von Natur aus mit der asynchronen Funktionalität kompatibel (ähnlich wie LINQ-to-Objects).

Für dieses spezielle Szenario wird empfohlen, einen alternativen Ansatz zu verfolgen. Dabei wird jedes Element in eine asynchrone Operation projiziert. Anschließend kann der Abschluss dieser Vorgänge asynchron abgewartet werden.

using (DataContext db = new DataLayer.DataContext())
{
    var tasks = db.Groups.ToList().Select(i => GetAdminsFromGroupAsync(i.Gid));
    var results = await Task.WhenAll(tasks);
}

Dieser Ansatz bietet mehrere Vorteile gegenüber der Verwendung eines asynchronen Delegaten mit ForEach:

  • Verbesserte Fehlerbehandlung: Ausnahmen, die von asynchronen Void-Vorgängen herrühren, können nicht mit „catch“ behandelt werden. Alternativ verbreitet diese Methode Ausnahmen an der Zeile, an der Task.WhenAll erwartet wird, und ermöglicht so natürliche Ausnahmebehandlungsfunktionen.
  • Abschlusssichtbarkeit: Der Abschluss der Aufgaben ist am Ende von leicht erkennbar Diese Methode ist auf den Einsatz von Task.WhenAll zurückzuführen. Im Gegensatz dazu fehlt bei asynchronen Void-Operationen eine direkte Möglichkeit, den Abschluss zu bestimmen.
  • Natürliche Syntax: Dieser Ansatz entspricht der natürlichen Syntax zum Abrufen von Ergebnissen. GetAdminsFromGroupAsync impliziert einen Vorgang, der ein Ergebnis liefert (die Administratoren), wodurch dieser Code intuitiver wird, wenn solche Vorgänge ihre Ergebnisse zurückgeben können, anstatt sich beim Festlegen von Werten auf Nebenwirkungen zu verlassen.

Das obige ist der detaillierte Inhalt vonKönnen asynchrone Vorgänge mit ForEach verwendet werden und was ist die beste Alternative?. 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