我有静态类,带有一些信息的静态字典。 字典有密钥作为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并使用包装器作为键吗?