2016-06-15 2 views
0

나는 ConditionalWeakTable의 큰 팬이다. 정말 대단합니다. 기본적으로 하나의 참조를 다른 참조에 연결/연결/쌍으로 연결하는 동시에 스레드로부터 안전합니다.튜플 키 (또는 여러 참조로 구성된 키)와 함께 ConditionalWeakTable을 사용할 수 있습니까?

많은 질문/문제에 대한 답변입니다. 불행히도, 나는 계속해서 뛰어 들어가고 그것에 대한 좋은 대답을 찾을 수 없었던 문제가있는 것 같습니다.

ConditionalWeakTable을 사용하는 방법 (아래의 테스트 방법으로 표시)이 있다고 가정 해 봅시다. 대신 키에 대한 단일 참조를 사용하는 대신 두 개의 항목을 결합하여 키로 사용해야합니다. 이것은 (단순히 데모 및 간결성에 대한 확장 Tuple 임) Key 객체로서 아래와 같다 다음 Debugger.Break는 호출

[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) {} 
} 

상기 ConditionalWeakTable은에 대한 활성 참조가에도 비어 시험 방법에서 Key의 부분 중 하나. 이는 Key에 대한 참조가 테스트에서 찾을 수 없기 때문에 의미가 있습니다.

그러나 Key 개체의 부분 중 하나에 대한 활성 참조가 있으므로 ConditionalWeakTable의 항목을 활성 상태로 유지하고 해당 하위/내부 참조가 모두 주장 될 때까지 활성 상태로 유지하고 싶습니다.

(이 가능한 솔루션에 대한 생각, 그것은 어떻게 든 Dictionary<>의 열쇠로 사용할 수있는 WeakHashSet굉장이 있었다한다면,하지만 일부 검색에서, WeakHashSet가에 있는지 표시되지 않습니다. NET)

이 내용이 내 딜레마를 설명하기를 바랍니다. 기본적으로 ConditionalWeakTable (또는 이와 동등한)을 사용하여 관련된 값 (키/값 항목)을 저장하려고하지만 하나의 (약한) 참조를 항목의 키로 사용하는 대신 두 가지를 사용하고 싶습니다. (이상).

내가 달성하고자하는 것은 (사용자 정의 코드를 상당량 작성하지 않고) 가능한 것입니까?

답변

0

이 질문은 this question과 관련이 있으며 마침내이 문제를 해결하는 답변을 찾았습니다. 자세한 내용은 대답을 읽을 수 있습니다.

이 질문에 관해서. ConditionalWeakTable에 사용하기 위해 "키"를보다 세련되고 영리하게/지능적으로 사용합니다. 제 경우에는 키의 세 부분 (인스턴스, 메서드 및 인수)과 씨름하고있었습니다. 나는 Delegate (이는 기본적으로 인스턴스와 메소드에 대한 참조 튜플)을 사용하여 처음 두 개를 결합한 다음 에 StructuralEqualityComparer을 사용하여 쌍을 이루었습니다. 워라. 문제 해결됨.