2017-10-31 3 views
3

ist es richtig, eine "Verzweigung" ohne await-Operator in einer asynchronen Methode zu haben?Async-Methode ohne Wartezeit

public async Task<Person> GetName(string name) 
    { 
     if (string.IsNullOrWhiteSpace(name)) 
     { 
      return null; 
     } 
     return await _database.Logins.FirstOrDefaultAsync(i => i.Name.Contains(name)); 
    } 

Asynchronous programming sagt

Asynchron-Methoden ein await Stichwort in ihrem Körper haben müssen, oder sie werden nie nachgeben!

Wenn await im Rumpf einer asynchronen Methode nicht verwendet wird, generiert der C# Compiler eine Warnung, aber der Code wird kompiliert und als ausgeführt, wenn es sich um eine normale Methode handelt. Beachten Sie, dass dies auch unglaublich ineffizient

wäre

Gilt dies auch für meine Methode anwenden, wie es await enthält, aber nicht in jedem Zweig

Thank you!

Antwort

3

Wenn Sie async dekorierte Methoden haben, wandelt der Compiler null in Task.FromResult<Person>(null) um.

Wenn Ihre Methode hat ein await in seinem Körper dann der Compiler tatsächlich eine Klasse erzeugen, die eine Zustandsmaschine, die den Überblick über all await Fortsetzungen hält, so dass Ihr Code ausgeführt wird, wie nach jeder Aufgabe Fertigstellung sollte, die Sie warten. Die State Machine-Klasse behält alle Variablen und Stacks bei.

3

Ja, es ist vollkommen akzeptabel, einige Pfade innerhalb einer async Methode zu haben, die tatsächlich synchron sind.

Sie würden im Allgemeinen nur solche Pfade haben (wie in Ihrem Beispiel), wo sie "schnelle" Erfolgs-/Fehlerpfade sind, und nur die "langsamen" Pfade können von der Verwendung von await profitieren.