首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步EF 6与包装同步EF

异步EF 6与包装同步EF
EN

Stack Overflow用户
提问于 2015-05-19 17:23:28
回答 1查看 242关注 0票数 1

所以..。这可能是个愚蠢的问题。我无法完全理解为什么使用EF6异步将提高性能,而不是在任务中包装同步EF6调用(假设db调用在wrapping方法中)

也就是说,为什么:

代码语言:javascript
复制
//wrapping synch with asynch
return await Task.Run(() =>
{
    var albums = this.context.Albums
                .Where(x => x.Artist.ID == artist.ID)
                .ToList();
    return albums;
});

更糟糕的是:

代码语言:javascript
复制
//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操作之前,这两种实现不都会导致释放请求线程来处理其他请求吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-19 17:33:42

假设你在烤一顿丰盛的节日晚餐。将会有很多的食物,包括一只大鸡肉的主菜。做饭要花很长时间,所以你要提前准备好,放在烤箱里,然后设置一个计时器,稍后再检查,然后继续准备下一道菜(土豆泥)。

你不能只是坐在那里(同步地)等着鸡吃完;你需要让它(异步地)做饭,而你去准备所有其他的菜。如果你等着鸡吃完,然后再开始做任何其他的事情,除了你觉得超级无聊之外,当你吃完其他的东西时,鸡肉会变得冰凉的。

现在有几种方法可以使这个操作(让鸡做饭)发生,而你做其他工作。例如,您可以设置一个计时器,并在计时器通知您时间已到时立即对其进行检查。另一种解决办法是不要独自工作。你可以去抓住你的儿子,让他坐在炉子前等着鸡肉准备好,等他准备好了就通知你。

使用计时器类似于单线程异步解决方案。(每个人都是一根线。)只有一个工作人员(你),你开始异步工作,有异步通知什么时候你需要做的事情,但从来只有一件事在一次工作。厨房里有多个人类似于多线程应用程序。如果你用这几个人来做多个任务,需要一个实际的人同时做工作(比如说,你儿子在洗芦笋的时候你在捣碎土豆),那么你的工作做得更快了。当你利用那个额外的人(线程)除了坐在那里等待完成某件事之外什么也不做,当你出去工作的时候,你只是在浪费那个人(线程)的时间;他们宁愿去做一些有效率的事情。

因此,为了完全消除类比,当您使用Task.Run同步执行IO时,您将在线程池中调度工作,在线程池中,分配的线程只需要在等待IO完成时什么也不做(而不是做实际的生产性工作)。当您只使用固有的异步IO操作时,则根本不涉及其他线程。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30332204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档