我正在创建一个封装ConcurrentDictionary的自定义集合。我发现了很多关于封装/继承泛型集合的信息,但没有特定于并发集合的信息。这是我的基本案例的代码片段,后面是一些常见问题。
class ItemCollection
{
private ConcurrentDictionary<string, Item> Collection;
public ItemCollection() { Collection = new ConcurrentDictionary<string, Item>(); }
public bool TryAdd(string webId, string name) { return Collection.TryAdd(webId, new Item(name)); }
public bool TryAdd(string webId, Item item) { return Collection.TryAdd(webId, item); }
public bool TryUpdate(KeyValuePair<string, Item> entry, Data data)
{
Item newItem = entry.Value;
newItem.AddData(data);
return Collection.TryUpdate(entry.Key, newItem, entry.Value);
}
}
class ItemCollection : ConcurrentDictionary<string, Item>
一样,如果是这样的话,有哪些指南类似于this来继承非并发集合。 public IEnumerable<TResult> Select<ItemCollection, TResult>(this ItemCollection source, Func<KeyValuePair<string, Item>, TResult> selector) { return Collection.Select(selector); }
如果我继承ConcurrentDictionary,它会产生类似的实现
答案 0 :(得分:1)
这个问题接近于“过于宽泛”。也就是说,可以提供一些基本答案。有关更多详细信息,您必须进一步缩小问题范围,一次处理更小,更具体的问题,并且最好单独提出这些问题。
与此同时:
以这种方式封装并发集合是否可以接受,或者是否正在进入从通用集合创建自己的线程安全集合的领域?
“可接受”是一个广泛的概念,但是......是的,这种方法没有从根本上错误。
自定义集合是否是线程安全的?
“线程安全”是一个模糊的术语。但总的来说,我会说“是”。您的类根本不维护任何自己的状态,而是将所有状态委派给 线程安全的类。因此,对于线程安全的常见问题,类状态本身应该没问题。
请注意,TryUpdate()
方法还会修改传入的对象,即不以线程安全的方式完成。但这更多的是关于该对象的线程安全性,而不是您的集合。
继承并发集合是否可以接受?像这样的类ItemCollection:ConcurrentDictionary,如果有的话,什么是一些指南,类似于继承非并发集合。
继承非密封类始终是“可接受的”。是否有用这样做是另一回事。当继承的类具有有用的受保护和/或虚拟成员(派生类可用于实际扩展或以其他方式修改继承类的行为)时,继承最有用。
否则,扩展方法通常是更好的方法。
在任何情况下,我都不希望收集的继承指南会有很大差异,具体取决于集合是否是线程安全的。
如何为Select等方法实现转发方法?我尝试了一系列变体,如下所示,但无法使其发挥作用:
“像Select()这样的方法”被实现为扩展方法,并依赖于实现IEnumerable<T>
的对象本身(对于某些此类方法,IEnumerable
已经足够了)。如果您希望自定义集合能够使用这些方法,则必须为要与您的类一起使用的扩展方法实现适当的接口。
当然,在您的接口实现中,您可以将实际操作委托给封装的集合。