c# - 从同步方法调用异步方法
问题描述
我看到很多关于从同步方法调用 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
}
解决方案
System.Threading.Tasks.Task.Result 是一个等待任务完成的阻塞调用。所以它本质上有一个内置的等待调用。
在那个微软文档的备注部分:
访问属性的 get 访问器会阻塞调用线程,直到异步操作完成;相当于调用Wait方法。
不幸的是,Microsoft 没有在访问器的名称中反映这一点,因为这是该访问器的一个极其关键的副作用。
推荐阅读
- python - 使用日期范围创建新变量
- java - 是否可以仅在一行中执行此操作?
- python - 将包含键值对的列展开到它们自己的列中
- c# - 查看组件数据输入验证
- java - 如果类是类型,它们可以保存什么类型的数据?
- javascript - 使用 javascript 调整图像大小创建空白画布图像
- oauth - LinkedIn oauth v1 登录 - 范围 rw_migration 错误
- groovy - Groovy 的列表“in”运算符
- java - 在将字符解析为 ascii 与比较我已经设置的分配值之间的循环中是否存在问题?
- pandas - Pandas applymap函数不格式化数字