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
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
Im folgenden Beispiel enthält die asynchrone Methode GetDateTimeAsync eine Return-Anweisung, die die aktuelle Zeit zurückgibt. Daher muss in der Methodendeklaration Task
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 Task
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 Task
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)!