2013-06-24 4 views
8

У меня есть ConcurrentDictionary в моем классе сеанса.
Ключ - это интерфейс, представляющий класс менеджера.
Значение - это список классов DataContracts, которые используются для этого менеджера в этом сеансе.Утилизировать словарь в лучшей практике C#

Когда я удаляю класс сеанса, я хочу очистить этот словарь. Мне нужно очистить все значения и ключи, но я не могу распоряжаться ключами - поскольку они все еще существуют после того, как класс удалил.

Этого достаточно? - приведет ли это к тому, что GC выполнит эту работу?

_myDictionary = null; 

Или мне нужно выполнить итерацию с помощью foreach на всех клавишах и использовать Удалить для очистки значений.

+0

Этого хватит. Однако, если что-либо, кроме словаря, сохраняет ссылки на значения, то, конечно, значения не будут освобождены до тех пор, пока эти другие ссылки не исчезнут. –

ответ

16

Когда я удаляю класс сеанса, я хочу очистить этот словарь.

Почему? Если экземпляр сеанса станет подходящим для сбора мусора, а сеанс является единственным объектом, который относится к словарю, словарь станет подходящим для сбора мусора.

Этого достаточно? - приведет ли это к тому, что GC выполнит эту работу?

Это почти наверняка не нужно. Если что-либо еще имеет ссылку на словарь, то установка , что переменной на null не будет иметь никакого эффекта. Если ничто иное не ссылается на словарь, и сеанс станет подходящим для сбора мусора, то вам вообще не нужно это делать.

Единственный раз, когда он стоит установка переменной нулевое значение для сборки мусора, когда что сама переменная будет жить (например, это переменная экземпляра в объекте, который не будет мусора, или это статическая переменная).

Обратите внимание, что сбор мусора полностью разделен на «удаление» объектов, между прочим. Dispose и IDisposable, как правило, касаются неуправляемых ресурсов, и в вашем вопросе нет никаких указаний на то, что эта концепция имеет значение здесь.

+0

Поскольку словарь управляется ресурсом, при утилизации класса сеанса он будет GC автоматически? Никакой другой класс не ссылается на этот словарь, но ключ определенного набора ключей/значений является ссылкой на класс, который будет жить после сеанса, поэтому я уверен, что, возможно, это может повлиять на распоряжение. И этот класс реализует образец оптимальной практики IDispsoable. – ilansch

+0

@ilansch: Опять же, сбор и сбор мусора являются отдельными. Если ничто иное не относится к экземпляру сеанса, тогда сеанс может быть собран в мусор.Тот факт, что ключ не является сборкой мусора, не останавливает словарь от сбора мусора - отношения не от ключа к словарю, а наоборот. –

+0

Хорошо. спасибо за ответ. Мое недоразумение было, так как я также держу делегата callback в этом сеансе как частный член, этот делегат должен быть установлен равным null при размещении сеанса. в противном случае ссылка все еще существует из сеанса в долгоживущий класс. – ilansch

-1

Сразу после этого вы можете позвонить по телефону GC.Collect();, чтобы убедиться, что ваш GC активирован.

+6

Вызов 'GC.Collect' редко требуется. Пусть GC определит, когда он должен действовать (и «GC.Collect» не приведет к немедленному запуску GC, он не детерминирован). – keyboardP

+0

Это не поможет/не сделает ничего, если на нем есть ссылка. –

Смежные вопросы