有一个已经窃听我关于实体框架很长一段时间的事情。实体框架,DBContext和使用()+异步?
去年我写了使用EF一个客户端一个大的应用程序。在开发过程中,一切都很顺利。
我们运系统在8月。但几周后,我开始在生产服务器上看到奇怪的内存泄漏。运行几天后(8 GB),我的ASP.NET MVC 4进程占用了机器的所有资源。这并不好。我在网上搜索,发现你应该将所有的EF查询和操作都包含在using()
块中,以便处理上下文。
一天我重构我的代码使用using()
,这解决了我的问题,因为那么过程坐落在一个稳定的内存使用情况。
然而,我并没有将我的查询放在首位,原因是我从Visual Studio自带的脚手架开始了我的第一个控制器和存储库,这些脚手架并没有围绕它的查询,而是使用了DbContext
作为控制器本身的一个实例变量。
首先的:如果处置方面的真正重要的(东西不会是奇怪,在dbconnection
需要关闭等),微软或许应该有这种在其所有的例子!
现在,我已经开始研究一个新的大型项目,并将我的所有知识放在脑后,我一直在尝试.NET 4.5和EF 6 async
和await
的新功能。 EF 6.0具有所有这些异步方法(例如SaveChangesAsync
,ToListAsync
等)。
public Task<tblLanguage> Post(tblLanguage language)
{
using (var langRepo = new TblLanguageRepository(new Entities()))
{
return langRepo.Add(RequestOrganizationTypeEnum, language);
}
}
在TblLanguageRepo
类:
public async Task<tblLanguage> Add(OrganizationTypeEnum requestOrganizationTypeEnum, tblLanguage language)
{
...
await Context.SaveChangesAsync();
return langaugeDb;
}
然而,当我现在环绕我的语句在using()
块我得到的异常,DbContext was disposed
,查询已经能够返回之前。这是预期的行为。查询运行异步,并且using
块在查询之前完成。但是,如何在使用ef 6的异步和等待函数时以适当的方式处理我的上下文?
请指点我正确的方向。
需要在EF 6 using()
?为什么微软自己的例子从来没有这样做?你如何正确使用异步功能并处理你的上下文?
这是密切相关的:[EF数据上下文 - 异步/等待和多线程](http://stackoverflow.com/questions/20946677/ef-data-context-async-await-multithreading) – Noseratio