是否可以将ConditionalWeakTable与元组键(或由多个引用组成的键)一起使用?

时间:2016-06-15 22:11:56

标签: c# .net memory-management weak-references

我是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(或一些等价物)来存储关联的值(作为键/值条目),而不是使用一个(弱)引用作为条目的键,我会喜欢使用两个(或更多)。

我希望实现的目标是什么(无需编写大量自定义代码)?

1 个答案:

答案 0 :(得分:0)

这个问题与CSS negation pseudo-class (:not())有关,我终于找到了解决这个问题的答案,而且答案很顺利。您可以阅读答案以获取更多详细信息。

关于这个问题。它归结为更精致/聪明/智能地使用&#34;键&#34;用于<p data-label="Local">-Brasília/DF</p>。就我而言,我正在与一个键的三个部分(实例,方法和参数)搏斗。我设法通过使用ConditionalWeakTable(基本上是实例和方法的参考元组)来组合前两个,然后将其与使用this questionDelegate配对。 Whalah。问题解决了。