Was ist die richtige Art zu verwenden async/await in eine rekursive Methode?

Was ist die richtige Art zu verwenden async/await in eine rekursive Methode? Hier ist meine Methode:

public string ProcessStream(string streamPosition)
{
    var stream = GetStream(streamPosition);

    if (stream.Items.count == 0)
        return stream.NextPosition;

    foreach(var item in stream.Items) {
        ProcessItem(item);
    }

    return ProcessStream(stream.NextPosition)
}

Und hier ist die Methode mit dem async/await:

public async Task<string> ProcessStream(stringstreamPosition)
{
        var stream = GetStream(streamPosition);

        if (stream.Items.count == 0)
            return stream.NextPosition;

        foreach(var item in stream.Items) {
            await ProcessItem(item); //ProcessItem() is now an async method
        }

        return await ProcessStream(stream.NextPosition);
 }
  • Sehen Sie eventuelle Fehler mit, was du versucht hast?
  • Nope, scheint einwandfrei zu funktionieren. Ich wurde gerade gefragt, ob es irgendeine mögliche Gefahr.
  • Wie ist mein code synchron? Mit dem await-Schlüsselwort enthält, wird die Methode zurückgeben soll, sofort, um die Anrufer richtig? Ich habe nur angefangen zu lernen, async/await heute, so gibt es wahrscheinlich eine Menge Lücken in meinem Verständnis.
  • ja, es ist mein Fehler
  • Sieht ziemlich korrekt zu mir. Nicht sicher, was Sie erwarten sind Sie hier.
  • Du bist fehlen einige Zeilenende-Zeichen (;), und mit Ihr stream.NextPosition als ob es war ein string wenn Sie zurück sind, aber int wenn Sie es weitergeben zu ProcessStream. Jetzt bekamen wir, dass aus der Art und Weise, diese Methode ist trivial zu implementieren, wie eine einfache Schleife, die Vermeidung von Rekursion zusammen - und das ist eine gute Idee, weil die in synchronen Szenarien (einschließlich der Fälle, in denen rekursive Tasks synchron abgeschlossen) Rekursion kann dazu führen StackOverflowExceptions. Wahrscheinlich wird nicht passieren, in Ihrem Fall, aber warum würden Sie sogar das Risiko, wenn Sie können, verwenden Sie eine einfache Schleife, ist mir schleierhaft.
  • vielen Dank für die Hinweise. Ich habe korrigiert den code. Würden Sie bitte mir ein code-snippet für das nicht-rekursive Weise?

InformationsquelleAutor Prabhu | 2014-07-29
Schreibe einen Kommentar