У меня есть статический класс со статическим словарем с некоторыми сведениями.
В словаре есть ключ WeakReference (я не хочу предотвращать сбор мусора объекта реального ключа).
Пример кода:
public static class ThreadHelper {
private static readonly object syncRoot = new object();
private static Dictionary<WeakReference, ThreadInfo> threadInfos = new Dictionary<WeakReference, ThreadInfo>();
// some static thread safe methods for adding, removing and changes items
}
Каков хороший (или лучший) способ очистки элементов в словаре "threadInfos", которые фактически пусты и не будут использоваться в будущем?
Должен ли я проверять наличие "пустых" ключей в каждом методе добавления / удаления / изменения, или я должен делать это по-другому, или я должен делать концепцию совершенно иначе?
Спасибо
РЕДАКТИРОВАТЬ 2: Похоже, ответ является более сложным, чем я думал. Я предоставляю полный исходный код класса ThreadHelper на Класс ThreadHelper и исходный код простого теста на Простой тест .
EDIT:
Метод, который находит ключ выглядит:
private static WeakReference FindThreadReference( Thread thread ) {
WeakReference ret = null;
WeakReference[] keys;
lock ( syncRoot ) {
keys = threadInfos.Keys.ToArray();
}
foreach ( var key in keys ) {
if ( key.IsAlive ) {
var tmpThread = key.Target;
if ( object.ReferenceEquals( tmpThread, thread ) ) {
ret = key;
}
}
}
return ret;
}
Я до сих пор не понимаю, почему использование WeakReference является ключевой плохой идеей (но пока это не важно). Должен ли я обернуть WeakReference некоторым классом struct и использовать обертку в качестве ключа?