ConditionalWeakTable — поведение GC.Collect(), почему оно не работает должным образом?C#

Место общения программистов C#
Ответить
Anonymous
 ConditionalWeakTable — поведение GC.Collect(), почему оно не работает должным образом?

Сообщение Anonymous »


Почему мой слабый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 = ноль; }
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»