Beenden oder beenden Sie die C#-Async-Methode mit „return“
-
21-12-2019 - |
Frage
Ich war neu in der async-await
Methode in C# 5.0
, und ich habe nur wenige Fragen im Kopf
Was ist der beste Weg, einem zu entkommen?
async
Methode, wenn ein Eingabeargument oder eine Nullprüfung fehlgeschlagen ist?Was ist der logische Ablauf der Verwendung?
return;
in einer Aufgabeasync
Methode (Unter bestimmten Umständen wurde es zu einer Endlosschleife)?Ist
CancellationToken
oderTask.Yield
Passen Sie besser in dieses Szenario?
public Func<AzureBlobInfo, string, Task> UploadSuccessCallBackAsync { get; set; }
private async Task OnUploadSuccessAsync(AzureBlobInfo info)
{
if (this.UploadSuccessCallBackAsync == null)
{
return;
}
var transactionType = this.FormData.Get("transactionType");
if (string.IsNullOrEmpty(transactionType))
{
transactionType = "unknown";
}
await this.UploadSuccessCallBackAsync(info, transactionType);
}
Lösung
Der beste Weg, „bei einem Problem zu scheitern“, wäre meiner Meinung nach, die entsprechende Ausnahme auszulösen. Aber Sie können es auf jeden Fall einfach verwenden return;
wenn Sie Ausnahmen lieber vermeiden möchten.
Dadurch wird eine abgeschlossene/fehlerhafte Aufgabe erstellt, die synchron abgeschlossen wurde, sodass der Anrufer sie verwenden kann await
erhält eine abgeschlossene Aufgabe und verwendet weiterhin denselben Thread.
CancellationToken
ermöglicht der Anrufer um den Vorgang abzubrechen, was nicht der von Ihnen beschriebene Fall ist.Task.Yield
beendet keinen Vorgang, sondern ermöglicht lediglich die Ausführung anderer Aufgaben für einige Zeit und plant sich selbst für einen späteren Zeitpunkt neu.
Andere Tipps
Sie können jederzeit sicher von einer asynchronen Methode zurückkehren.In Ihrem Fall (Methode, die eine Aufgabe zurückgibt) generiert der Compiler eine beendete Aufgabe, sodass jeder Aufrufer, der auf Ihre Funktion wartet, fortfährt.
Beim Auslösen einer Ausnahme von einem async
Methode wird in der Aufgabe erfasst, sodass sie nicht ausgelöst wird, bis die Aufgabe durch den Aufruf beobachtet wird Task.Wait()
, Task.Result
, auf die Aufgabe warten oder auf die zugreifen Exceptions
Eigenschaft der Aufgabe.
In Bezug auf Eingabeargumente besteht eine Möglichkeit, dies zu umgehen, darin, die Methode in zwei Teile aufzuteilen. Der erste überprüft die Eingabeargumente und ruft dann die zweite Methode auf async
.Sehen Das Fragenantwort von Stephen Cleary als Beispiel.Auf diese Weise wird die Ausnahme des Eingabearguments direkt außerhalb der von der Methode zurückgegebenen Aufgabe ausgelöst.