Очистка статических ссылок - PullRequest
1 голос
/ 20 августа 2009

У меня есть статический класс со статическим словарем с некоторыми сведениями. В словаре есть ключ 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 и использовать обертку в качестве ключа?

...