这两种方法的工作方式是否相同?这两个都阻塞了主线程,不是吗?
// 1. Use async method
public IEnumerable<Entity> AsyncMethod()
{
return Context.Entities.ToListAsync().Result;
}
// 2. Use sync method
public IEnumerable<Entity> SyncMethod()
{
return Context.Entities.ToList();
}
答案 0 :(得分:15)
对于您提及的特定 API,我不知道它们是否相同;这些API的专家应该回答。
在 general 中,如果存在同步API和异步API,是否保证异步API的结果与同步API相同?
否即可。作为合同的一部分,同步API应保证在合理的时间内产生结果或异常。 允许异步API的Result
进入&#34;死锁&#34; 。
这是因为允许异步API通过调度工作在将来的当前线程上完成,然后运行后续关联的任务它是完整的。通过同步地要求Result
,您可以进入这个线程上计划将来运行的工作的情况,但是这个线程现在正在阻塞,直到工作完成,并且我们有一个单线程的死锁情况。
有关导致死锁的原因以及如何防止死锁的详细信息,请参阅this article。
获取Result
任务几乎永远不。如果您需要任务的结果,await
它。
答案 1 :(得分:0)
这两种方法的工作方式是否相同?这两个阻止主线程,都不是<?p?
是的,两者都阻止主线程。所以它有效地表现得相同。
第一种方法ToList
为async
,Result
将阻止,直到ToList
任务完成。第二种方法不是async
。
当它只是ToList
时,使用Result
可能没什么意义。
答案 2 :(得分:0)
这两种方法的工作方式是否相同?
是的,基本上这两种方法的工作方式相同。
这两个阻止主线程,都不是<?p?
如果ToList
为async
,Results
将停止,直到ToList
任务完全完成。