实体框架内存未发布

c# entity-framework entity-framework-6

我正在使用一个非常简单的asp.net mvc应用程序与Entity Framework 6.0.2,.Net 4.5.1:

public class HomeController : Controller
{
   public ActionResult Index()
   {
      int count;
      using (var db = new LocalContext())
      {
         count = db.Counters.Count();
      }
      return View(count);
   }
}

public class Counter
{
   public int Id { get; set; }
}

public class LocalContext : DbContext
{
   public DbSet<Counter> Counters { get; set; }
}

如果我对它进行负载测试,我最终会得到Out Of Memory异常。 ( tinyget -srv:localhost -port:<port> -uri:/home/index/ -threads:30 -loop:5000 )。在性能监视器中,我看到第2代Heap稳步增长。如果我使用较小的循环值(比如500),则大小会增加,直到tinyget停止。然后堆大小保持不变(至少20分钟,之后我停止了服务器)。

我究竟做错了什么?

编辑

所以我尝试了Simon Mouriers的建议并省略了EF代码。然后我没有记忆问题。所以我想,也许如果我使用Release而不是Debug,它会有所作为。它做到了!内存在一段时间后被释放,我可以在网站上施加高负荷。然后我切换回Debug,看看我是否可以获得更多信息......即使在调试模式下也没有问题了。 FML,我工作了一天,现在我再也无法重现了。

热门答案

在您的情况下,继承自DbContext的内部托管类将需要实现IDisposable并在LocalContext内添加以下内容:

public void Dispose()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
     if (disposing)
     {
        // Manage any native resources.
     }
   //Handle any other cleanup.
}

如果没有专门覆盖对dispose的调用,则using语句只会针对基类调用Dispose(),而您需要处理父类和基类。



Related

许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因