【问题标题】:Is it Possible to Use ConditionalWeakTable with a Tuple Key (or a key comprised of multiple references)?是否可以将 ConditionalWeakTable 与元组键(或由多个引用组成的键)一起使用?
【发布时间】: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&lt;&gt; 的密钥,那将是真棒,但通过一些搜索,它确实.NET 中似乎不存在WeakHashSet。)

希望这能说明我的困境。我基本上想使用 ConditionalWeakTable (或一些等效的)来存储关联的值(作为键/值条目),而不是使用一个(弱)引用作为条目的键,我想使用两个(或更多)。

我希望实现的目标是否可行(即无需编写大量自定义代码)?

【问题讨论】:

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


    【解决方案1】:

    这个问题与this question有关,我终于找到了解决这个问题的答案,那个问题很好。您可以阅读答案以了解更多详细信息。

    关于这个问题。它归结为更精致/聪明/智能地使用“密钥”来用于ConditionalWeakTable。就我而言,我正在与一个键的三个部分(实例、方法和参数)搏斗。我设法通过使用Delegate(它基本上是实例和方法的引用元组)将前两个组合起来,然后将其与使用StructuralEqualityComparerDictionary&lt;object[], object&gt; 配对。哇啦。问题解决了。

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 2023-03-30
      • 1970-01-01
      • 2015-11-07
      • 2011-10-25
      • 2020-06-26
      • 2023-03-10
      • 2015-04-17
      • 2014-01-13
      相关资源
      最近更新 更多