首页 > 解决方案 > 从同步方法调用异步方法

问题描述

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

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

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

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

     return result
}

标签: c#asynchronous

解决方案


请参阅Task<>.Result 上的文档

System.Threading.Tasks.Task.Result 是一个等待任务完成的阻塞调用。所以它本质上有一个内置的等待调用。

在那个微软文档的备注部分:

访问属性的 get 访问器会阻塞调用线程,直到异步操作完成;相当于调用Wait方法。

不幸的是,Microsoft 没有在访问器的名称中反映这一点,因为这是该访问器的一个极其关键的副作用。


推荐阅读