Unter welchen Umständen sollte man die
public async Task AsyncMethod(int num)
anstelle von
public async void AsyncMethod(int num)
Das einzige Szenario, das ich mir vorstellen kann, ist, wenn Sie die Aufgabe benötigen, um ihren Fortschritt verfolgen zu können.
Sind in der folgenden Methode die Schlüsselwörter async und await überflüssig?
public static async void AsyncMethod2(int num)
{
await Task.Factory.StartNew(() => Thread.Sleep(num));
}
47 Stimmen
@Fred Meistens, aber nicht immer. Dies ist nur die Konvention und die akzeptierten Ausnahmen von dieser Konvention sind ereignisbasierte Klassen oder Schnittstellenverträge, siehe MSDN . So sollten Sie beispielsweise gängige Ereignis-Handler wie Button1_Click nicht umbenennen.
18 Stimmen
Nur eine Anmerkung, die Sie nicht verwenden sollten
Thread.Sleep
mit Ihren Aufgaben sollten Sieawait Task.Delay(num)
stattdessen78 Stimmen
@fred Ich stimme damit nicht überein, IMO Hinzufügen einer async Suffix sollte nur verwendet werden, wenn Sie eine Schnittstelle mit sowohl sync und async Optionen bereitstellen. Dinge mit async zu benennen, wenn es nur eine Absicht gibt, ist sinnlos. Beispiel
Task.Delay
ist nichtTask.AsyncDelay
da alle Methoden der Aufgabe Async sind18 Stimmen
Ich hatte ein interessantes Problem heute Morgen mit einem webapi 2 Controller-Methode, es wurde als deklariert
async void
stattdessenasync Task
. Die Methode stürzte ab, weil sie ein Entity Framework-Kontextobjekt verwendete, das als Mitglied des Controllers deklariert war und entsorgt wurde, bevor die Methode zur Ausführung kam. Das Framework hat den Controller entsorgt, bevor seine Methode ausgeführt wurde. Ich änderte die Methode in async Task und es funktionierte.2 Stimmen
Ich denke dieser Link hilft.