Hok*_*ike 0 c# asynchronous entity-framework
所以..这可能是一个愚蠢的问题.我无法完全了解为什么使用EF6 Async会提高性能,而不是在Task中包装同步EF6调用(假设db调用在Web API REST api方法中)
即,这是为什么:
//wrapping synch with asynch
return await Task.Run(() =>
{
var albums = this.context.Albums
.Where(x => x.Artist.ID == artist.ID)
.ToList();
return albums;
});
Run Code Online (Sandbox Code Playgroud)
比这更糟糕的是:
//using async
return await this.context.Albums
.Where(x => x.Artist.ID == artist.ID)
.ToListAsync();
Run Code Online (Sandbox Code Playgroud)
注意:我已经阅读了这篇文章http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx,这似乎说(过度简化)"不要只包装同步方法,重写该方法更有效".
问题1,EF6异步实现是做什么的?我假设它在实现中使用异步I/O?
问题2(和我真正的问题) - 有人可以解释为什么这更好?在db操作完成之前,两个实现是否都不会导致请求线程自由处理其他请求?
假设您正在享用一顿丰盛的节日晚餐.将有大量的食物,包括一个大鸡的主菜.这需要很长时间才能烹饪,所以你要做好准备并将其早早放入烤箱,然后设置定时器以便稍后检查,然后继续准备下一道菜(土豆泥).
你不能只是坐在那里等待(同步)鸡肉完成; 当你去准备所有其他菜肴时,你需要让它(异步)烹饪.如果你在开始工作之前等待鸡肉完成其他任何事情,除了你非常无聊之外,当你完成其他所有事情时,鸡肉会被冰冷.
现在有几种方法可以让你在做其他工作时进行这种操作(让鸡烹饪).例如,您可以设置计时器,并在计时器通知您时间已到时立即检查计时器.另一种解决方案是不能自己动手.你可以去抓住你的儿子并告诉他只是坐在炉子前等待鸡准备好并让他在准备好时通知你.
使用计时器类似于单线程异步解决方案.(每个人都是一个线程.)只有一个工人(你),你开始异步工作,有异步通知,你需要什么时候做,但一次只做一件事.在厨房中有多个人类似于多线程应用程序.如果你正在使用那些多人实际做多个任务,需要一个真正的人同时做工作(比如,你的儿子正在洗芦笋时你正在捣碎土豆),那么你就完成了你的工作快点.当你使用那个额外的人(线程)什么也不做,只是坐在那里等待一些事情完成,当你去做工作,那么你只是在浪费那个人(线程)的时间; 他们宁愿去做一些富有成效的事情.
因此,为了完全剥离类比,当你用来Task.Run同步执行IO 时,你在线程池中调度工作,在这里,分配的线程只需要在那里做任何事情(而不是做实际的生产工作),而等待IO到完.当您只使用固有的异步IO操作时,根本不涉及其他线程.
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |