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

黄舟
Freigeben: 2017-02-07 15:08:48
Original
1882 Leute haben es durchsucht

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: Task, 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.

Task

[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 Task.

Task 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 Task angegeben werden.

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

Rufen Sie die GetDateTimeAsync-Methode auf:

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

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;
}
Nach dem Login kopieren

Die GetDateTimeAsync-Methode wird über die CallAsync-Methode aufgerufen, und der Aufruf der nicht unmittelbar wartenden Methode GetDateTimeAsync gibt Task zurück. Im Beispiel wird die Aufgabe der Variable Task der DateTime zugewiesen. Da die Task-Variable von DateTime Task 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 Task angewendet wird, wird der Warteausdruck als Inhalt der DateTime-Eigenschaft der Task 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}");
}
Nach dem Login kopieren

[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!");
}
Nach dem Login kopieren

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();
Nach dem Login kopieren

Jetzt trenne ich die Methode des Aufrufens und Wartens:

//分离
Task delayTask = DelayAsync();
await delayTask;        
void
Nach dem Login kopieren

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 Task 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 „Task“ 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);
}
Nach dem Login kopieren

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)!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!