Как я могу продемонстрировать, что выпущена слабая ссылка? - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь протестировать некоторый код, который использует WeakReference - как заставить принудительно собрать эталонный объект, чтобы reference.Target вернул null?

Я пытался

WeakReference reference = new WeakReference(null);
{
    reference.Target = new object();
}

Console.WriteLine(reference.Target);

GC.Collect();
Thread.Sleep(1000);

Console.WriteLine(reference.Target);

Console.ReadLine();

, но цель не null в обоих случаях. Также пытался звонить GC.Collect несколько раз, но, похоже, это не имеет значения.

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Если кто-то не интересуется целью слабой ссылки, а просто хочет выяснить, умерла ли она, лучше проверить, стало ли свойство IsAlive false, чем проверить, является ли Target собственность стала null. Хотя это может не решить все проблемы с отладочными сборками, сохраняя объекты живыми дольше, чем ожидалось, это позволит избежать некоторых других проблем, которые могут возникнуть, особенно при использовании одновременной сборки мусора. Цель WeakReference не может быть собрана, пока существует какая-либо сильная ссылка, и, таким образом, получение Target из WeakReference по крайней мере временно защитит данный объект от сбора. Это может быть неизбежным в некоторых случаях, когда код на самом деле хочет что-то сделать с рассматриваемой ссылкой, но нет никаких причин рисковать продлением жизни объекта, если кто-то просто пытается выяснить, когда он умирает.

0 голосов
/ 05 июля 2018

Запустите код в Выпуск build (оптимизация включена) и Запуск без отладки и сборщик мусора хорошо демонстрирует ожидаемое поведение.

Отладчик будет сохранять ваши переменные в области видимости как корни GC на случай, если вам потребуется их проверить.

Также используйте общую версию, WeakReference<T>. Были проблемы с использованием API для неуниверсального, которые были решены в универсальном. Смотри: http://www.philosophicalgeek.com/2014/08/14/prefer-weakreferencet-to-weakreference/

РЕДАКТИРОВАТЬ: Не обновлять и заметить, что пост был старый, и комментарии уже охватили это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...