异步方法.Result vs Sync方法

时间:2017-05-22 22:52:35

标签: c# .net asynchronous async-await

这两种方法的工作方式是否相同?这两个都阻塞了主线程,不是吗?

// 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();
}

3 个答案:

答案 0 :(得分:15)

对于您提及的特定 API,我不知道它们是否相同;这些API的专家应该回答。

general 中,如果存在同步API和异步API,是否保证异步API的结果与同步API相同?

即可。作为合同的一部分,同步API应保证在合理的时间内产生结果或异常。 允许异步API的Result进入&#34;死锁&#34;

这是因为允许异步API通过调度工作在将来的当前线程上完成,然后运行后续关联的任务它是完整的。通过同步地要求Result,您可以进入这个线程上计划将来运行的工作的情况,但是这个线程现在正在阻塞,直到工作完成,并且我们有一个单线程的死锁情况。

有关导致死锁的原因以及如何防止死锁的详细信息,请参阅this article

获取Result任务几乎永远不。如果您需要任务的结果,await它。

答案 1 :(得分:0)

  

这两种方法的工作方式是否相同?这两个阻止主线程,都不是<?p?

是的,两者都阻止主线程。所以它有效地表现得相同。

第一种方法ToListasyncResult将阻止,直到ToList任务完成。第二种方法不是async

当它只是ToList时,使用Result可能没什么意义。

答案 2 :(得分:0)

  

这两种方法的工作方式是否相同?

是的,基本上这两种方法的工作方式相同。

  

这两个阻止主线程,都不是<?p?

如果ToListasyncResults将停止,直到ToList任务完全完成。