所以..。这可能是个愚蠢的问题。我无法完全理解为什么使用EF6异步将提高性能,而不是在任务中包装同步EF6调用(假设db调用在wrapping方法中)
也就是说,为什么:
//wrapping synch with asynch
return await Task.Run(() =>
{
var albums = this.context.Albums
.Where(x => x.Artist.ID == artist.ID)
.ToList();
return albums;
});更糟糕的是:
//using async
return await this.context.Albums
.Where(x => x.Artist.ID == artist.ID)
.ToListAsync();注意:我读过这篇文章,http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx似乎说过(过于简化)“不要仅仅包装同步方法,更有效地重写该方法”。
问题1,这是EF6异步实现所做的吗?我假设它在实现中使用异步I/O?
问题2 (以及我真正的问题)--有人能解释一下为什么这样更好吗?在完成db操作之前,这两种实现不都会导致释放请求线程来处理其他请求吗?
发布于 2015-05-19 17:33:42
假设你在烤一顿丰盛的节日晚餐。将会有很多的食物,包括一只大鸡肉的主菜。做饭要花很长时间,所以你要提前准备好,放在烤箱里,然后设置一个计时器,稍后再检查,然后继续准备下一道菜(土豆泥)。
你不能只是坐在那里(同步地)等着鸡吃完;你需要让它(异步地)做饭,而你去准备所有其他的菜。如果你等着鸡吃完,然后再开始做任何其他的事情,除了你觉得超级无聊之外,当你吃完其他的东西时,鸡肉会变得冰凉的。
现在有几种方法可以使这个操作(让鸡做饭)发生,而你做其他工作。例如,您可以设置一个计时器,并在计时器通知您时间已到时立即对其进行检查。另一种解决办法是不要独自工作。你可以去抓住你的儿子,让他坐在炉子前等着鸡肉准备好,等他准备好了就通知你。
使用计时器类似于单线程异步解决方案。(每个人都是一根线。)只有一个工作人员(你),你开始异步工作,有异步通知什么时候你需要做的事情,但从来只有一件事在一次工作。厨房里有多个人类似于多线程应用程序。如果你用这几个人来做多个任务,需要一个实际的人同时做工作(比如说,你儿子在洗芦笋的时候你在捣碎土豆),那么你的工作做得更快了。当你利用那个额外的人(线程)除了坐在那里等待完成某件事之外什么也不做,当你出去工作的时候,你只是在浪费那个人(线程)的时间;他们宁愿去做一些有效率的事情。
因此,为了完全消除类比,当您使用Task.Run同步执行IO时,您将在线程池中调度工作,在线程池中,分配的线程只需要在等待IO完成时什么也不做(而不是做实际的生产性工作)。当您只使用固有的异步IO操作时,则根本不涉及其他线程。
https://stackoverflow.com/questions/30332204
复制相似问题