В одном конкретном приложении я обнаружил, что без переноса блока DataContext
в using
объем используемой памяти продолжал увеличиваться, поскольку живые объекты не были выпущены для GC. Как в приведенном ниже примере, если я держу ссылку на объект List<Table>
и объекты доступа q
, я создаю граф объектов, который не освобождается для GC.
DBDataContext db = new DBDataContext()
var qs =
from x in db.Tables
where x.Id == someId
select x;
return qs.toList();
foreach(q in qs)
{
process(q);
// cannot dispose datacontext here as the 2nd iteration
// will throw datacontext already disposed exception
// while accessing the entity of q in process() function
//db.Dispose();
}
process(Table q)
{
// access entity of q which uses deferred execution
// if datacontext is already disposed, then datacontext
// already disposed exception is thrown
}
Учитывая этот пример, я не могу утилизировать текст данных, потому что все Table
экземпляры в переменной списка qs
** имеют один и тот же текст данных . После Dispose()
доступ к объекту в process(Table q)
вызывает исключение уже обработанного текста данных.
Ужасный клубник, для меня, должен был удалить все ссылки на сущности для объектов q после цикла foreach. Лучше всего, конечно, использовать оператор using
.
Что касается моего опыта, я бы сказал, используйте выражение using
.