Heim > Backend-Entwicklung > C++ > Wie kann ich mit Task.Run eine asynchrone Methode synchron aufrufen?

Wie kann ich mit Task.Run eine asynchrone Methode synchron aufrufen?

DDD
Freigeben: 2025-01-19 13:47:09
Original
1005 Leute haben es durchsucht

How Can I Synchronously Call an Asynchronous Method Using Task.Run?

Verwenden Sie Task.Run, um asynchrone Methoden synchron aufzurufen

Asynchrone Programmierung ermöglicht es uns, lang andauernde Vorgänge auszuführen, ohne den Hauptthread zu blockieren. In einigen Fällen müssen wir jedoch möglicherweise asynchrone Methoden synchron aufrufen. So erreichen Sie dies mit Task.Run:

Szene:

Betrachten Sie die folgende asynchrone Methode:

public async Task<string> GenerateCodeAsync()
{
    string code = await GenerateCodeService.GenerateCodeAsync();
    return code;
}
Nach dem Login kopieren

Angenommen, wir müssen diese Methode synchron von einer anderen synchronen Methode aufrufen.

Lösung:

Um eine asynchrone Methode synchron auszuführen, können wir die Task.Run-Methode verwenden, um sie in einem Thread-Pool-Thread auszuführen:

string code = Task.Run(() => GenerateCodeAsync()).GetAwaiter().GetResult();
Nach dem Login kopieren

Dieser Code verwendet die folgenden Schritte:

  1. Task.Run: Es erstellt eine Hintergrund-Thread-Pool-Aufgabe und führt die GenerateCodeAsync-Methode aus.
  2. GetAwaiter(): Es ruft einen Waiter für die Aufgabe ab, der das Ergebnis des asynchronen Vorgangs darstellt.
  3. GetResult(): Es blockiert den aufrufenden Thread, bis der asynchrone Vorgang abgeschlossen ist, und gibt das Ergebnis der Methode zurück.

Nachteile der direkten Verwendung von .Result:

Die einfache Methode des direkten Zugriffs auf die Result-Eigenschaft der Aufgabe (d. h. string code = GenerateCodeAsync().Result;) sollte vermieden werden, da sie die folgenden Nachteile mit sich bringt:

  • Deadlock: Diese Methode kann einen Deadlock verursachen, wenn die asynchrone Methode versucht, beim Blockieren auf den UI-Thread zuzugreifen. Task.Run führt die Methode in einem separaten Thread aus und verhindert so dieses Problem.
  • Ausnahmebehandlung: .Result Jede Ausnahme, die in einer asynchronen Methode ausgelöst wird, wird in eine AggregateException eingeschlossen. Durch die Verwendung von .GetAwaiter().GetResult() vermeiden wir dieses Problem und erhalten die Ausnahme direkt.

Das obige ist der detaillierte Inhalt vonWie kann ich mit Task.Run eine asynchrone Methode synchron aufrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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