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
DDDOriginal
2025-01-19 13:47:09946Durchsuche

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:

<code class="language-c#">public async Task<string> GenerateCodeAsync()
{
    string code = await GenerateCodeService.GenerateCodeAsync();
    return code;
}</code>

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:

<code class="language-c#">string code = Task.Run(() => GenerateCodeAsync()).GetAwaiter().GetResult();</code>

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!

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