【发布时间】:2016-10-17 05:33:40
【问题描述】:
我是ConditionalWeakTable 的忠实粉丝。这真的很棒。它本质上允许您将一个引用关联/附加/配对另一个引用,同时是线程安全的。
它为我回答了很多问题/问题。不幸的是,我似乎一直在遇到一个问题,并且无法找到一个好的答案。
假设我有一个方法(由下面的测试方法表示),其中我使用ConditionalWeakTable,但不是使用单个引用作为密钥,而是需要组合两个项目并使其成为密钥。这通过Key 对象在下面显示(它只是一个扩展的Tuple 用于演示目的和简洁性):
[Fact]
public void TupleKey()
{
var first = new object();
var table = new ConditionalWeakTable<Key, object>();
var context = table.GetValue( new Key( first, new object() ), key => new object() );
// .. table has one entry here.
GC.Collect();
GC.WaitForPendingFinalizers();
Debugger.Break(); // Table is empty here.
}
class Key : Tuple<object, object>
{
public Key( object item1, object item2 ) : base( item1, item2 ) {}
}
当调用Debugger.Break 时,ConditionalWeakTable 为空,即使在测试方法中有对Key 部分之一的活动引用。这是有道理的,因为在测试中找不到对 Key 的引用。
但是,由于有一个对 Key 对象的某一部分的活动引用,我希望 ConditionalWeakTable 中的条目也保持活动状态,并保持活动状态,直到其所有子/内部引用都被声称。
(在考虑这个和可能的解决方案时,如果有一个WeakHashSet 可以以某种方式用作Dictionary<> 的密钥,那将是真棒,但通过一些搜索,它确实.NET 中似乎不存在WeakHashSet。)
希望这能说明我的困境。我基本上想使用 ConditionalWeakTable (或一些等效的)来存储关联的值(作为键/值条目),而不是使用一个(弱)引用作为条目的键,我想使用两个(或更多)。
我希望实现的目标是否可行(即无需编写大量自定义代码)?
【问题讨论】:
标签: c# .net memory-management weak-references