Не удалось освободить фрейм-память Entity

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; }
}

Если я проведу нагрузку, я в конечном итоге получаю исключение из памяти. ( tinyget -srv:localhost -port:<port> -uri:/home/index/ -threads:30 -loop:5000 ). В мониторе производительности я вижу, что поколение 2 Heap постоянно растет. Если я использую меньшее значение цикла (скажем, 500), размер увеличивается до тех пор, пока tinyget не остановится. Затем размер кучи остается неизменным (по крайней мере 20 минут, после чего я остановил сервер).

Что я делаю не так?

РЕДАКТИРОВАТЬ

Поэтому я попробовал предложение Саймона Моурье и отказался от кода 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.
}

Без специального переопределения вызова для распоряжения оператор using будет только вызывать Dispose () для базового класса, тогда как вам нужно распоряжаться родительским и базовым.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему