c# - 同步调用异步方法

标签 c# asp.net asynchronous task-parallel-library async-await

我有一个异步方法:

public async Task<string> GenerateCodeAsync()
{
    string code = await GenerateCodeService.GenerateCodeAsync();
    return code;
}

我需要从一个同步方法调用这个方法。

我怎样才能做到这一点而不必复制 GenerateCodeAsync 方法以使其同步工作?

更新

目前还没有找到合理的解决方案。

但是,我看到 HttpClient 已经实现了这个模式

using (HttpClient client = new HttpClient())
{
    // async
    HttpResponseMessage responseAsync = await client.GetAsync(url);

    // sync
    HttpResponseMessage responseSync = client.GetAsync(url).Result;
}

最佳答案

您可以访问任务的 Result 属性,这将导致您的线程阻塞,直到结果可用:

string code = GenerateCodeAsync().Result;

注意:在某些情况下,这可能会导致死锁:您对 Result 的调用会阻塞主线程,从而阻止异步代码的其余部分执行。您可以选择以下选项来确保不会发生这种情况:

并不意味着您应该在所有异步调用之后无意识地添加.ConfigureAwait(false)!有关为什么以及何时应该使用 .ConfigureAwait(false) 的详分割析,请参阅以下博客文章:

关于c# - 同步调用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22628087/

相关文章:

c# - 将记录插入到 SQL Server CE 数据库移动到另一个线程? C# Compact Framework 3.5

asp.net - AppCache 适用于 Firefox (30) 但不适用于 IE (11)

android - 有人可以解释如何在 Android 中使用 ASyncTask 吗?

c# - 为什么异步调用后调试器不在断点处停止?

c# - Windows 窗体没有扩展方法

c# - 在 C# 中使用 SMO 从 ExecuteNonQuery 语句获取错误消息

c# - 脚本 bundle 问题 - 正确的顺序

c# - 为多语言站点配置 ASP.NET MVC 属性路由

javascript - Promise - `then()` 未按预期工作

c# - 为什么我的代码不能正常同步工作?