サブスクリプションリストを作成しようとしています。サブスクリプションのスレッドセーフなリストのための最善のデータ構造ですか?
は、辞書の使用ことは理にかなっています>加入者 - >雑誌 - 、各雑誌のリストを持つ、各加入者のリストを持っ
出版出版社の
リスト:のは、例を見てみましょう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