將異步和同步代碼集成在c#
中許多C#項目並非完全異步。本文解決了從同步上下文中調用異步方法的挑戰和解決方案。 它是可行的嗎?
是的,可以從同步代碼調用異步方法。 但是,同步和異步編程的不同執行模型可以創建複雜性。 安全整合的方法
幾種方法有助於這種整合:
方法1:
對於不需要上下文同步的異步方法(每個Task.WaitAndUnwrapException
>使用),
await
ConfigureAwait(false)
方法2:Task.WaitAndUnwrapException
(對於上下文敏感的等待)
<code class="language-csharp">var task = MyAsyncMethod(); var result = task.WaitAndUnwrapException(); </code>>創建一個嵌套的上下文來執行任務:
AsyncContext.RunTask
方法3:
AsyncContext.RunTask
>
<code class="language-csharp">var result = AsyncContext.RunTask(MyAsyncMethod).Result;</code>不適用時,將異步方法卸載到線程池。 異步方法必須與線程池的上下文兼容:
選擇正確的方法取決於異步方法的特定需求及其與周圍同步代碼的相互作用。 仔細考慮上下文和潛在的僵局至關重要。
以上是如何從C#中的同步方法中安全地調用異步方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!