가입 목록을 작성하려고합니다.스레드로부터 안전한 서브 스크립 션 목록을위한 최상의 데이터 구조가 필요합니까?
이 사전의 사용하는 것이 합리적이다> 가입자 -> 잡지 - 각 잡지의 목록을 가지고, 각 가입자의 목록을 가지고
출판사 발행인의
목록 : 이제 예제를 보자 C# 사전에서 사전 내에. 경합 조건없이 가입자를 추가/제거 할 때 전체 구조를 잠그지 않고이 작업을 수행 할 수 있습니까?
또한 코드가 C#에서 매우 빠르게 지저분 해져서 올바른 경로를 따라 가지 않을 것이라고 생각합니다. 이 작업을 수행하는 더 쉬운 방법이 있습니까? 다음은 생성자 있습니다 및 방법에 가입 :
참고 : 코드는
소스 ---> 유형 ---> 가입자
public class SubscriptionCollection<SourceT, TypeT, SubscriberT>
{
// Race conditions here I'm sure! Not locking anything yet but should revisit at some point
ConcurrentDictionary<SourceT, ConcurrentDictionary<TypeT, ConcurrentDictionary<SubscriberT, SubscriptionInfo>>> SourceTypeSubs;
public SubscriptionCollection()
{
SourceTypeSubs = new ConcurrentDictionary<SourceT, ConcurrentDictionary<TypeT, ConcurrentDictionary<SubscriberT, SubscriptionInfo>>>();
}
public void Subscribe(SourceT sourceT, TypeT typeT, SubscriberT subT) {
ConcurrentDictionary<TypeT, ConcurrentDictionary<SubscriberT, SubscriptionInfo>> typesANDsubs;
if (SourceTypeSubs.TryGetValue(sourceT, out typesANDsubs))
{
ConcurrentDictionary<SubscriberT, SubscriptionInfo> subs;
if (typesANDsubs.TryGetValue(typeT, out subs))
{
SubscriptionInfo subInfo;
if (subs.TryGetValue(subT, out subInfo))
{
// Subscription already exists - do nothing
}
else
{
subs.TryAdd(subT, new SubscriptionInfo());
}
}
else
{
// This type does not exist - first add type, then subscription
var newType = new ConcurrentDictionary<SubscriberT, SubscriptionInfo>();
newType.TryAdd(subT, new SubscriptionInfo());
typesANDsubs.TryAdd(typeT, newType);
}
}
else
{
// this source does not exist - first add source, then type, then subscriptions
var newSource = new ConcurrentDictionary<TypeT, ConcurrentDictionary<SubscriberT, SubscriptionInfo>>();
var newType = new ConcurrentDictionary<SubscriberT, SubscriptionInfo>();
newType.TryAdd(subT, new SubscriptionInfo());
newSource.TryAdd(typeT, newType);
SourceTypeSubs.TryAdd(sourceT, newSource);
};
}
이 질문 C#을 특이인가, 또는 당신은 어디서나 사용할 수있는 방법을 찾고있다? – svick
아무 데나 정말로 .. 그럼 C# –
에 적응할 수 있습니다. 질문이 C# 특정 적이기 때문에, 직접 사용할 수있는 .Net 프레임 워크에 클래스가 있기 때문에 묻습니다. – svick