Я сделал это только вчера.Вот что я должен был добавить, чтобы убедиться, что сбор произошел до вашего последнего утверждения:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.WaitForFullGCComplete();
GC.Collect();
Если после этого .IsAlive все еще имеет значение true, вероятно, где-то еще есть надежная ссылка.* Между прочим - обязательно НЕ проверяйте .IsAlive, когда вы получаете доступ к своей цели WeakReference.Чтобы избежать состояния гонки между проверкой .IsAlive и .Target, сделайте следующее:
var r = weakRef.Target AS Something;
if (r != null)
{
... do your thing
}