c# - 从同步方法调用异步方法

标签 c# asynchronous

我看到很多关于从同步方法调用异步方法的问题,比如这里:How to call asynchronous method from synchronous method in C#?

我理解这些解决方案,但是,通过实验,我发现我不需要添加 .Wait()Task.Run(async () => await MyAsyncMethod( )) 让它同步运行。我有一个从数据库中提取信息的 get 方法。

我的代码在下面,当我运行时,它在 var task = GetItemAsync() 处等待,我从数据库中得到了正确的结果。我发现很难相信数据库调用会在代码继续运行之前返回,这似乎暗示它是同步运行的。我错过了什么吗?

public object GetItem()
{
     var task = GetItemAsync();
     var result = task.Result;

     return result
}

最佳答案

调用 awaitable(method which returns Task) 方法的唯一正确方法是 await 它。但是您只能在返回Task 的方法中await。在遗留代码中,你无法更改方法签名,因为你有太多的引用,你需要基本上重构整个代码库。所以你有这些选择:

.Result
.Wait()
.GetAwaiter().GetResult()

这两个都不好。所有这些都将阻塞线程。但是,如果您不能将方法签名更改为 await 执行,我会选择最后一个选项 - GetAwaiter().GetResult() 因为它不会将异常包装到 聚合异常

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

相关文章:

c# - 将字符串中 '=' 的所有实例替换为 '=='

c# - 相当于 UInt16 的 SQL

ios - Swift 5.5 异步让 - 错误 : expression is 'async' but is not marked with 'await'

multithreading - 加入第一个完成的线程?

c# - 异步等待...和任务。我究竟做错了什么

c# - 使用 Drive API 访问 Google Drive 电子表格

c# - 如何更新唯一的子 GridView?

c# - 如何用 c sharp 解密 "encrypted string with java"?

java - 从套接字中读取所有数据

c# - 在 C# 并行任务中为多个服务调用创建并行任务