Heim >Backend-Entwicklung >C++ >Wie kann ich asynchron C# -Methoden synchron aufrufen?
asynchrone Methoden, die typischerweise als public async Task Foo()
deklariert sind, sind für gleichzeitige Operationen und verbesserte Benutzererfahrungen von entscheidender Bedeutung. Die Integration in vorhandene synchrone Codebasen erfordert jedoch eine sorgfältige Berücksichtigung. Untersuchen wir mehrere Ansätze.
Task.WaitAndUnwrapException
für einfache asynchrone Methoden, die nicht auf der Kontextsynchronisation beruhen (z. B. diejenigen, die ConfigureAwait(false)
), bietet Task.WaitAndUnwrapException
eine einfache Lösung:
<code class="language-csharp">var task = MyAsyncMethod(); var result = task.WaitAndUnwrapException();</code>
Dies behandelt Ausnahmen ohne die zusätzliche Schicht von AggregateException
. Diese Methode ist jedoch unangemessen, wenn MyAsyncMethod
eine Kontextsynchronisation erfordert.
AsyncContext.RunTask
Wenn die Kontextsynchronisation essentiell ist, liefert AsyncContext.RunTask
einen verschachtelten Kontext:
<code class="language-csharp">var result = AsyncContext.RunTask(MyAsyncMethod).Result;</code>
Dies verhindert effektiv Deadlocks, die durch das Blockieren von Waiten auf Aufgaben entstehen könnten, die nicht ConfigureAwait(false)
.
Task.Run
Wenn AsyncContext.RunTask
ungeeignet ist (z. B. wenn asynchrone Methoden auf UI -Ereignisse warten), laden Sie die asynchrone Methode in den Thread -Pool aus:
<code class="language-csharp">var task = Task.Run(async () => await MyAsyncMethod()); var result = task.WaitAndUnwrapException();</code>
Dieser Ansatz verlangt, dass MyAsyncMethod
thread-sicher ist und nicht von UI-Elementen oder dem ASP.NET-Anforderungskontext abhängt. Alternativ liefert die Verwendung ConfigureAwait(false)
mit Methode 1 eine praktikable Alternative.
Für ein tieferes Verständnis konsultieren Sie Stephen Clearys eindeutige MSDN -Artikel "Async Programming - Brownfield Async Development".
Das obige ist der detaillierte Inhalt vonWie kann ich asynchron C# -Methoden synchron aufrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!