ConditionalWeakTable — поведение GC.Collect(), почему оно не работает должным образом? ⇐ C#
-
Anonymous
ConditionalWeakTable — поведение GC.Collect(), почему оно не работает должным образом?
Почему мой слабыйRef.Target все еще жив на втором снимке?
Может ли это быть ошибка? Если нет, то где ошибка?
Результат:
weakRef.Target is active = True, ожидается true, потому что inst удерживает SomeClass. слабыйRef.Target активен = True, ожидается false, потому что ссылки на SomeClass больше нет. Код:
публичный статический класс DelegateKeeper { частный статический ConditionalWeakTable cwtAction = новый ConditionalWeakTable(); public static void KeepAlive(Action action) => cwtAction.Add(action.Target, action); } публичный класс SomeClass { общественная недействительность DoSomething() { } } общедоступный статический класс GcHelper { публичная статическая пустота Collect() { // Хорошо, конечно, перебор, но просто на всякий случай. Я уменьшу его, когда все будет понятно. GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true); GC.WaitForPendingFinalizers(); GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true); GC.WaitForPendingFinalizers(); } } Экземпляр SomeClassSomeClass; WeakReference слабаяСсылка; [Метод испытания] публичная пустота TestLifeOfObject() { В этом(); GcHelper.Collect(); Debug.WriteLine($"weakRef.Target активен = {weakRef.TryGetTarget(out _)}, ожидается true, потому что inst удерживает SomeClass."); RemoveLastReferenceOnSomeClass(); GcHelper.Collect(); Debug.WriteLine($"weakRef.Target активен = {weakRef.TryGetTarget(out _)}, ожидается false, поскольку на SomeClass больше нет ссылки."); } частная пустота Init() { экземплярSomeClass = новый SomeClass(); вар действие = экземплярSomeClass.DoSomething; слабаяСсылка = новый WeakReference(действие); DelegateKeeper.KeepAlive(действие); } частная пустота RemoveLastReferenceOnSomeClass() { экземплярSomeClass = ноль; }
Почему мой слабыйRef.Target все еще жив на втором снимке?
Может ли это быть ошибка? Если нет, то где ошибка?
Результат:
weakRef.Target is active = True, ожидается true, потому что inst удерживает SomeClass. слабыйRef.Target активен = True, ожидается false, потому что ссылки на SomeClass больше нет. Код:
публичный статический класс DelegateKeeper { частный статический ConditionalWeakTable cwtAction = новый ConditionalWeakTable(); public static void KeepAlive(Action action) => cwtAction.Add(action.Target, action); } публичный класс SomeClass { общественная недействительность DoSomething() { } } общедоступный статический класс GcHelper { публичная статическая пустота Collect() { // Хорошо, конечно, перебор, но просто на всякий случай. Я уменьшу его, когда все будет понятно. GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true); GC.WaitForPendingFinalizers(); GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true); GC.WaitForPendingFinalizers(); } } Экземпляр SomeClassSomeClass; WeakReference слабаяСсылка; [Метод испытания] публичная пустота TestLifeOfObject() { В этом(); GcHelper.Collect(); Debug.WriteLine($"weakRef.Target активен = {weakRef.TryGetTarget(out _)}, ожидается true, потому что inst удерживает SomeClass."); RemoveLastReferenceOnSomeClass(); GcHelper.Collect(); Debug.WriteLine($"weakRef.Target активен = {weakRef.TryGetTarget(out _)}, ожидается false, поскольку на SomeClass больше нет ссылки."); } частная пустота Init() { экземплярSomeClass = новый SomeClass(); вар действие = экземплярSomeClass.DoSomething; слабаяСсылка = новый WeakReference(действие); DelegateKeeper.KeepAlive(действие); } частная пустота RemoveLastReferenceOnSomeClass() { экземплярSomeClass = ноль; }
Мобильная версия