我正在尝试构建订阅列表。让我们的例子:出版商订阅的线程安全列表的最佳数据结构?
列表,每个都具有杂志的列表,每个都具有用户列表
出版商 - >杂志 - >订阅
有道理使用字典在C#中的Dictionary中的字典中。添加/删除没有竞争条件的用户时,是否可以在不锁定整个结构的情况下执行此操作?
此外,代码在C#中非常迅速地变得混乱,这使我认为我不会走正确的道路。有没有更简单的方法来做到这一点?下面是构造函数和subscribe方法:
注:该代码使用来源,类型,用户不使用名字而上述
源--->类型--->用户
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