首页 > 后端开发 > C++ > 如何在C#中同步调用异步方法?

如何在C#中同步调用异步方法?

Patricia Arquette
发布: 2025-01-19 13:43:10
原创
846 人浏览过

How Can I Synchronously Invoke an Asynchronous Method in C#?

同步调用异步方法

问题:

您有一个如下签名的异步方法:

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

但是,您需要在同步上下文中同步调用此方法。如何实现?

解决方案:

为了同步调用异步方法,您可以使用线程池线程来执行该方法。通过使用任务的awaiter,您可以阻塞调用线程,直到异步操作完成:

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

注意事项:

需要注意直接使用.Result的缺点:

  1. 死锁: 使用.Result可能会导致死锁,因为主线程被阻塞,从而妨碍异步方法的完成。为防止这种情况,请谨慎使用.ConfigureAwait(false)。这种方法并非没有其复杂性。但是,使用Task.Run在线程池线程上执行异步方法消除了此潜在问题。
  2. 异常处理: .Result 将异步方法中抛出的任何异常封装在AggregateException中。为了避免这个问题,请改用.GetAwaiter().GetResult()

以上是如何在C#中同步调用异步方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板