2017-05-22 16 views
0

Wir alle wussten, Async Await wegen möglich gemacht wird state in Kraft gesetzt wird, das mich für folgende Anwendungsfall zu einer Frage führen:Async/stateKopf erwarten

Public async Task<string> GetTotal(string p1) 
{ 
    Return await GetTotal(p1,””); 
} 
Public async Task<string> GetTotal(string p1, string p2) 
{ 
    Return await GetTotal(p1,””,””); 
} 

Public async Task<string> GetTotal(string p1, string p2, string p3) 
{ 
    Return await GetTotal(p1,””,””, “”); 
} 

Public async Task<string> GetTotal(string p1, string p2, string p3,string 
p4) 
{ 
//do some actual async calling 
    Return result; 
} 

Wenn es keine async/await in Bild, der obige Code ist absolut normal, aber für async/erwarten, sollten wir Codierungsmuster wie oben aufgeführt vermeiden, im Grunde, sollten wir versuchen, State Machines zu vermeiden, wenn wir nicht müssen?

Public async Task<string> GetTotal(string p1) 
{ 
    //do some actual async calling 
    Return result; 
} 
Public async Task<string> GetTotal(string p1, string p2) 
{ 
    //do some actual async calling 
    Return result; 
} 
Public async Task<string> GetTotal(string p1, string p2, string p3) 
{ 
    //do some actual async calling 
    Return result; 
} 
Public async Task<string> GetTotal(string p1, string p2, string p3,string 
p4) 
{ 
//do some actual async calling 
Return result; 
} 
+2

nicht 'await' Verwenden Sie, wenn Sie nicht brauche es wirklich. Eine Funktion ohne "erwarten" in ihrem Körper sollte nicht einmal "async" auf sie angewendet haben. – xxbbcc

+1

FWIW, ich sehe diese Frage und die verknüpfte nicht als exakte Duplikate, und es gibt * eine Menge *, die speziell über den Overhead * gesagt werden kann, der in der anderen Frage nicht wirklich relevant (oder gegenwärtig) ist. –

+1

Ich überlegte, wieder zu öffnen, aber wir haben bereits https://Stackoverflow.com/q/37861864/ –

Antwort

-1

Wenn Sie

public async Task<string> GetTotal(string p1) 
{ 
    Return await GetTotal(p1,””); 
} 

zu

public Task<string> GetTotal(string p1) 
{ 
    return GetTotal(p1,””); 
} 

(durch die async und await in Funktionen zu entfernen, die Asynchron-Arbeit nicht tun) ändern Sie die unnötige Zustandsmaschine vermeiden Übergeben Sie einfach das innerste Task-Objekt. Dies sollte getan werden, um unnötige Aufgabenzuweisungen (und Zustandsmaschinen) zu vermeiden.

Auch mit der neuen ValueTask Klasse mit zusätzlichen async Funktionen, die innere Funktionen umhüllen, gibt es zusätzliche Speicherzuweisung/Speicherbereinigungskosten, wenn dies in einem High-Throughut-Code-Pfad getan wird.

+0

Lesen Sie den unteren Code, den er gepostet. Das ist, was er erwähnt hat ... – FrankerZ

+1

@FrankerZ - nein, das OP schien zu entscheiden, ihren Code in allen vier Methoden im unteren Beispiel zu duplizieren. Es gibt keine Aufrufe an die Methoden mit mehr Parametern angezeigt. –

0

Es gibt Overhead bei Methoden mit dem Modifikator async. Wenn möglich, speichern Sie den Fehler und geben Sie die Aufgabe zurück, wenn Sie dies vermeiden können.

Dies ist absolut gültig und wird empfohlen Ansatz. Entfernen Sie das async-Schlüsselwort, und geben Sie die Aufgabe von der anderen asynchronen Methode zurück. Die Zustandsmaschine wird nur einmal (in der Funktion getTotal) erzeugt werden:

public Task<string> GetTotal(string p1) 
{ 
    //do some actual async calling 
    return result; 
} 

Weiterführende Literatur können Sie über lesen async/await Kopf here