清理静态引用

时间:2009-08-20 07:49:55

标签: c# .net multithreading garbage-collection

我有静态类,带有一些信息的静态字典。 字典有密钥作为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 class提供了ThreadHelper类的完整源代码,在Simple test提供了简单的测试源代码。

修改 找到键的方法看起来:

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并使用包装器作为键吗?

0 个答案:

没有答案