我看到很多有关从同步方法调用asyc方法的问题,例如:How to call asynchronous method from synchronous method in C#?
我了解解决方案,但是从实验上看,我不需要添加.Wait()
或Task.Run(async () => await MyAsyncMethod())
即可使其同步运行。我有一个get方法,可以从数据库中获取信息。
我的代码在下面,当我运行时,它在var task = GetItemAsync()
等待,我从数据库中获得了正确的结果。我发现很难相信DB调用可以在代码继续运行之前返回,这似乎暗示它是同步运行的。我想念什么吗?
public object GetItem()
{
var task = GetItemAsync();
var result = task.Result;
return result
}
答案 0 :(得分:1)
System.Threading.Tasks.Task.Result是一个阻塞调用,等待任务完成。因此,它本质上具有内置的等待调用。
在该Microsoft文档的备注部分:
访问属性的get访问器会阻塞调用线程,直到异步操作完成为止;等效于调用Wait方法。
不幸的是,微软没有以访问器的名称反映这一点,因为这是该访问器的极其关键的副作用。
答案 1 :(得分:1)
调用awaitable(返回Task
方法的方法)的唯一正确方法是await
。但是您只能在返回await
的方法中使用Task
。在遗留代码中,由于您有太多的引用,并且您基本上需要重构整个代码库,因此您无法更改方法签名。因此,您有以下选择:
.Result
.Wait()
.GetAwaiter().GetResult()
这些都不是好事。所有这些都将转到block the thread
。但是,如果您不能将方法签名更改为await
的执行,我会选择最后一个选项-GetAwaiter().GetResult()
,因为它不会将异常包装到AggregateException