Frage

Ich war neu in der async-await Methode in C# 5.0, und ich habe nur wenige Fragen im Kopf

  1. Was ist der beste Weg, einem zu entkommen? async Methode, wenn ein Eingabeargument oder eine Nullprüfung fehlgeschlagen ist?

  2. Was ist der logische Ablauf der Verwendung? return; in einer Aufgabe async Methode (Unter bestimmten Umständen wurde es zu einer Endlosschleife)?

  3. Ist CancellationToken oder Task.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);
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top