У меня есть инструмент отчетности, который работает на MS SQL Server с использованием EF4. Основная часть этого отчета включает в себя циклическое построение более 5000 строк и последующее извлечение множества других строк для каждой из них.
Я вытягиваю начальные строки через один контекст данных. Код, который извлекает связанные строки, включает использование другого контекста данных, заключенного в оператор using. Однако может показаться, что память, используемая вторым контекстом данных, никогда не освобождается, и ее использование увеличивается до 1,5 ГБ, прежде чем выдается исключение нехватки памяти.
Вот фрагмент кода, чтобы вы могли понять:
var outlets = (from o in db.tblOutlets
where o.OutletType == 3
&& o.tblCalls.Count() > number && o.BelongsToUser.HasValue && o.tblUser.Active == true
select new { outlet = o, callcount = o.tblCalls.Count() }).OrderByDescending(p => p.callcount);
var outletcount = outlets.Count();
//var outletcount = 0;
//var average = outlets.Average(p => p.callcount);
foreach (var outlet in outlets)
{
using (relenster_v2Entities db_2 = new relenster_v2Entities())
{
//loop over calls and add history
//check the last time the history table was added to for this call
var lastEntry = (from h in db_2.tblOutletDistributionHistories
where h.OutletID == outlet.outlet.OutletID
orderby h.VisitDate descending
select h).FirstOrDefault();
DateTime? beginLooking = null;
Я надеялся, что с помощью второго контекста данных можно будет освободить память после каждой итерации. Казалось бы, это не так (или GC не работает вовремя)