gpt4 book ai didi

c# - Entity Framework 、DBContext 和 using() + 异步?

转载 作者:IT王子 更新时间:2023-10-29 04:21:53 24 4
gpt4 key购买 nike

有一个关于 Entity Framework 的问题困扰了我很长时间。

去年,我使用 EF 为客户编写了一个大型应用程序。在开发过程中,一切都很好。

我们在 8 月发布了系统。但几周后,我开始在生产服务器上看到奇怪的内存泄漏。我的 ASP.NET MVC 4 进程在运行几天后占用了机器的所有资源 (8 GB)。这不好。我在网上四处搜索,发现您应该将所有 EF 查询和操作包围在 using() block 中,以便可以处理上下文。

在一天之内,我重构了我所有的代码以使用 using(),这解决了我的问题,从那时起,该过程就稳定地占用了内存。

然而,我一开始没有围绕我的查询的原因是,我从 Visual Studio 中包含的 Microsoft 自己的脚手架开始了我的第一个 Controller 和存储库,这些没有围绕它的查询使用,而是它有 DbContext 作为 Controller 本身的实例变量。

首先:如果处理上下文真的很重要(这并不奇怪,dbconnection 需要关闭等等),微软也许应该在他们所有的例子中都有这个!

现在,我已经开始着手一个新的大项目,将我所有的知识都放在脑后,我一直在尝试 .NET 4.5 和 EF 6 async 的新功能,并且等待。 EF 6.0 具有所有这些异步方法(例如 SaveChangesAsyncToListAsync 等)。

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() block 中时,在查询能够返回之前,我得到了异常,DbContext 已被处置。这是预期的行为。查询异步运行,using block 在查询之前完成。但是,在使用 ef 6 的 async 和 await 函数时,我应该如何以正确的方式处理我的上下文??

请指出正确的方向。

EF 6 是否需要 using()?为什么微软自己的例子从来没有这样的特点?您如何使用异步功能并正确处理您的上下文?

最佳答案

您的代码:

public Task<tblLanguage> Post(tblLanguage language)
{
using (var langRepo = new TblLanguageRepository(new Entities()))
{
return langRepo.Add(RequestOrganizationTypeEnum, language);
}
}

在返回 Task 之前处理存储库。如果您使代码异步:

public async Task<tblLanguage> Post(tblLanguage language)
{
using (var langRepo = new TblLanguageRepository(new Entities()))
{
return await langRepo.Add(RequestOrganizationTypeEnum, language);
}
}

然后它将在 Task 完成之前释放存储库。实际发生的是,当您点击 await 时,该方法返回一个不完整的 Task(请注意,using block 此时仍处于“事件”状态观点)。然后,当 langRepo.Add 任务完成时,Post 方法恢复执行并释放 langRepo。当 Post 方法完成时,返回的 Task 完成。

有关详细信息,请参阅我的 async intro .

关于c# - Entity Framework 、DBContext 和 using() + 异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21631774/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com