Отладка объектов не удается завершить?
У меня есть следующий код в моем приложении, чтобы помочь мне проверить правильность завершения ViewModels:
#if DEBUG
static int openViewModels = 0;
protected AbstractViewModel()
{
openViewModels++;
}
~AbstractViewModel()
{
openViewModels--;
System.Diagnostics.Debug.WriteLine(openViewModels);
}
#endif
Все viewModels в моем приложении происходят из этого класса. Я обнаружил, что со временем openViewModels
увеличивается, подразумевая, что некоторые viewModels не в состоянии завершить.
Мне трудно понять, почему это так - я смотрел на свой код, но не могу понять, что заставляет некоторые объекты оставаться рядом. Существуют ли какие-либо инструменты или процедуры, которые могут помочь мне понять, что мешает завершить эти объекты?
2 ответа
Во-первых, это открыто для гонок с нитями; которые должны быть Interlocked.Increment(ref openViewModels)
а также Interlocked.Decrement(ref openViewModels)
,
Во-вторых, финализация недетерминирована. Если вы не заставите это, что вы не должны. Вы не должны ожидать, что они будут очищаться в какой-то определенный промежуток времени, особенно если у вас много доступной памяти. Завершение является фактором давления памяти.
Объекты не гарантируются для завершения. Если вам нужно надежное завершение, вы должны реализовать IDisposable
,