将异步和同步代码集成在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中文网其他相关文章!