integrieren asynchroner und synchroner Code in C#
Viele C# -Projekte sind nicht vollständig asynchron. Dieser Artikel befasst sich mit den Herausforderungen und Lösungen für die Aufruf asynchroner Methoden aus synchronen Kontexten.
Ist es machbar?
Ja, es ist möglich, asynchrone Methoden aus dem Synchroncode aufzurufen. Die unterschiedlichen Ausführungsmodelle synchroner und asynchroner Programmierung können jedoch Komplexitäten erzeugen.
Ansätze zur sicheren Integration
Mehrere Ansätze ermöglichen diese Integration:
Methode 1: Task.WaitAndUnwrapException
Für asynchrone Methoden, die keine Kontextsynchronisation erfordern (jeweils await
verwendet ConfigureAwait(false)
), bietet Task.WaitAndUnwrapException
eine sichere Möglichkeit, auf die Fertigstellung zu warten und das Ergebnis abzurufen:
<code class="language-csharp">var task = MyAsyncMethod(); var result = task.WaitAndUnwrapException(); </code>
Methode 2: AsyncContext.RunTask
(für kontextsensitive Erwartungen)
Wenn innerhalb der asynchronen Methode eine Kontextsynchronisation erforderlich ist, erstellt AsyncContext.RunTask
einen verschachtelten Kontext für die Ausführung der Aufgabe:
<code class="language-csharp">var result = AsyncContext.RunTask(MyAsyncMethod).Result;</code>
Methode 3: Task.Run
(für die Kompatibilität des Threadpools)
Wenn AsyncContext.RunTask
nicht anwendbar ist, lädt Task.Run
die asynchrone Methode in den Thread -Pool aus. Die asynchrone Methode muss mit dem Kontext des Thread -Pools kompatibel sein:
<code class="language-csharp">var task = Task.Run(async () => await MyAsyncMethod()); var result = task.WaitAndUnwrapException();</code>
Die Auswahl des richtigen Ansatzes hängt von den spezifischen Anforderungen Ihrer asynchronen Methode und seiner Interaktion mit dem umgebenden Synchroncode ab. Die sorgfältige Berücksichtigung des Kontextes und der möglichen Sackgassen sind entscheidend.
Das obige ist der detaillierte Inhalt vonWie kann ich sicher asynchrone Methoden aus synchronen Methoden in C#aufrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!