Heim  >  Artikel  >  Backend-Entwicklung  >  C#-Grundlagenüberprüfung Async-Rückgabetyp

C#-Grundlagenüberprüfung Async-Rückgabetyp

黄舟
黄舟Original
2017-02-07 15:08:481889Durchsuche

Vorwort


Der Blogger hat einfach die asynchronen Artikel gezählt, die er veröffentlicht hat, und es sind bereits 8 mit Unterbrechungen. Diesmal möchte ich den Rückgabetyp von asynchron nehmen Beispiel. Alleine reden.

Asynchrone Methoden haben drei mögliche Rückgabetypen: Taskb54c2c292509147c0b54128f4eb90887, Task und void.

Wann sollte welcher Rückgabetyp verwendet werden? Die spezifische Situation erfordert eine spezifische Analyse. Bei unsachgemäßer Verwendung entspricht das Ausführungsergebnis des Programms möglicherweise nicht Ihren Wünschen. Lassen Sie uns darüber sprechen, wie Sie verschiedene Rückgabetypen für verschiedene Situationen auswählen.

Taskb54c2c292509147c0b54128f4eb90887

[Denken Sie daran] Wenn Sie das Schlüsselwort async hinzufügen, müssen Sie ein Objekt zurückgeben, das für nachfolgende Vorgänge verwendet wird. Bitte verwenden Sie Taskb54c2c292509147c0b54128f4eb90887.

Taskb54c2c292509147c0b54128f4eb90887 Der Rückgabetyp kann für bestimmte asynchrone Methoden verwendet werden, bei denen der Operand den Typ TResult hat.

Im folgenden Beispiel enthält die asynchrone Methode GetDateTimeAsync eine Return-Anweisung, die die aktuelle Zeit zurückgibt. Daher muss in der Methodendeklaration Task9db9db54d21ae9db056aa10d2db0be56 angegeben werden.

async Task<DateTime> GetDateTimeAsync()
{
    //Task.FromResult 是一个占位符,类型为 DateTime
    return await Task.FromResult(DateTime.Now);
}

Rufen Sie die GetDateTimeAsync-Methode auf:

async Task CallAsync()
{
    //在另一个异步方法的调用方式
    DateTime now = await GetDateTimeAsync();
}

Wenn GetDateTimeAsync innerhalb eines Warteausdrucks aufgerufen wird, ruft der Warteausdruck den DateTime-Typwert ab, der in der von GetDateTimeAsync zurückgegebenen Aufgabe gespeichert ist.

async Task CallAsync()
{
    //在另一个异步方法的调用方式
    //DateTime now = await GetDateTimeAsync();
    //换种方式调用
    Task<DateTime> t = GetDateTimeAsync();
    DateTime now = await t;
}

Die GetDateTimeAsync-Methode wird über die CallAsync-Methode aufgerufen, und der Aufruf der nicht unmittelbar wartenden Methode GetDateTimeAsync gibt Task9db9db54d21ae9db056aa10d2db0be56 zurück. Im Beispiel wird die Aufgabe der Variable Task der DateTime zugewiesen. Da die Task-Variable von DateTime Task9db9db54d21ae9db056aa10d2db0be56 ist, gehört sie zur DateTime-Eigenschaft, die den Typ TResult enthält. In diesem Fall repräsentiert TResult den Datumstyp. Wenn „Warten“ auf eine Task9db9db54d21ae9db056aa10d2db0be56 angewendet wird, wird der Warteausdruck als Inhalt der DateTime-Eigenschaft der Task9db9db54d21ae9db056aa10d2db0be56 ausgewertet. Gleichzeitig wird der Wert der Now-Variablen zugewiesen.

Dieses Mal zeige ich verschiedene Variablen, Sie können die Ergebnisse selbst vergleichen:

async Task CallAsync()
{
    //在另一个异步方法的调用方式
    DateTime now = await GetDateTimeAsync();
    //换种方式调用
    Task<DateTime> t = GetDateTimeAsync();
    DateTime now2 = await t;
   //输出的结果对比
    Console.WriteLine($"now: {now}");
    Console.WriteLine($"now2: {now2}");
    Console.WriteLine($"t.Result: {t.Result}");
}

[Hinweis] Das Result-Attribut ist ein gesperrtes Attribut. Wenn Sie versuchen, darauf zuzugreifen, bevor seine Aufgabe abgeschlossen ist, wird der aktuell aktive Thread blockiert, bis die Aufgabe abgeschlossen ist und der Wert verfügbar ist. In den meisten Fällen sollten Sie auf den Eigenschaftswert zugreifen, indem Sie „await“ verwenden, anstatt direkt auf die Eigenschaft zuzugreifen.

Task

Asynchrone Methoden, die keine Return-Anweisung enthalten oder eine Return-Anweisung enthalten, die keinen Operanden zurückgibt, haben normalerweise den Rückgabetyp Task. Wenn diese Methoden für die asynchrone Ausführung geschrieben werden, sind sie Methoden, die Leerzeichen zurückgeben. Wenn Sie den Rückgabetyp „Task“ in einer asynchronen Methode verwenden, kann die aufrufende Methode den Wait-Operator verwenden, um den Abschluss des Aufrufers anzuhalten, bis die aufgerufene asynchrone Methode abgeschlossen ist.

Siehe Beispiel:

async Task DelayAsync()
{
    //Task.Delay 是一个占位符,用于假设方法正处于工作状态。
    await Task.Delay(100);
    Console.WriteLine("OK!");
}

Rufen Sie die DelayAsync-Methode auf und warten Sie darauf, indem Sie eine Wait-Anweisung anstelle eines Wait-Ausdrucks verwenden, ähnlich der Call-Anweisung für eine Methode, die void zurückgibt. Die Anwendung des Wait-Operators erzeugt in diesem Fall keinen Wert.

Sehen Sie sich ein Beispiel für den Aufruf von DelayAsync an.

//调用和等待方法在同一声明中
await DelayAsync();

Jetzt trenne ich die Methode des Aufrufens und Wartens:

//分离
Task delayTask = DelayAsync();
await delayTask;        
void

Der Rückgabetyp „void“ wird hauptsächlich in Ereignishandlern verwendet, bei denen ein Rückgabetyp „void“ erforderlich ist. Der Rückgabetyp „void“ kann auch als Alternative zu Methoden verwendet werden, die „void“ zurückgeben, oder für Methoden, die Aktivitäten ausführen, die als Call-and-Forget-Aktivitäten klassifiziert werden können. Allerdings sollten Sie nach Möglichkeit Task zurückgeben, da Sie nicht auf asynchrone Methoden warten können, die void zurückgeben. Jeder Aufrufer einer solchen Methode kann nur bis zum Abschluss fortfahren, ohne auf den Abschluss der aufgerufenen asynchronen Methode zu warten, und der Aufrufer muss unabhängig von Werten oder Ausnahmen sein, die von der asynchronen Methode generiert werden.

Aufrufer einer asynchronen Methode, die void zurückgibt, können von der Methode ausgelöste Ausnahmen nicht abfangen, und solche nicht behandelten Ausnahmen können zu Anwendungsfehlern führen. Wenn in einer asynchronen Methode, die eine Aufgabe oder Taskb54c2c292509147c0b54128f4eb90887 zurückgibt, eine Ausnahme auftritt, wird die Ausnahme in der zurückgegebenen Aufgabe gespeichert und beim Warten auf diese Aufgabe erneut ausgelöst. Stellen Sie daher sicher, dass alle asynchronen Methoden, die Ausnahmen auslösen können, den Rückgabetyp „Task“ oder „Taskb54c2c292509147c0b54128f4eb90887“ haben und dass auf Aufrufe dieser Methoden gewartet wird.

Ab sofort können Ausnahmen auch „await“ verwenden. Bitte gehen Sie hier „Rückblick auf die Vergangenheit und Gegenwart von C# – Erleben Sie die neuen Syntaxfunktionen von C# 6.0“.

Beispiel für einen ungültigen Rückgabewert:

private async void button1_Click(object sender, EventArgs e)
{
    //启动进程并等待完成
    await Task.Delay(100);
}

Das Obige ist die grundlegende C#-Überprüfung der Async-Rückgabetypen. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php. cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn