我看到很多关于从同步方法调用异步方法的问题,比如这里: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/