Inheriting/Encapsulating 并发集合 c#

Inheriting/Encapsulating a concurrent collection c#

我正在创建一个封装了 ConcurrentDictionary 的自定义集合。我从通用集合中找到了很多关于 encapsulating/inheriting 的信息,但没有找到特定于并发集合的信息。这是我的基本案例的代码片段,后面是一些一般性问题。

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);
    }
}

public IEnumerable<TResult> Select<ItemCollection, TResult>(this ItemCollection source, Func<KeyValuePair<string, Item>, TResult> selector) { return Collection.Select(selector); }

如果我继承了 ConcurrentDictionary,它会导致如下实现

问题接近 "too broad"。也就是说,可以提供一些基本的答案。如需更多详细信息,您将不得不进一步缩小问题范围,一次处理更小、更具体的问题,最好单独提出这些问题。

同时:

Is encapsulating concurrent collections in this manner acceptable, or is this moving into the realm of creating your own thread-safe collection from a generic collection?

"Acceptable" 是一个宽泛的概念,但是……是的,这种方法从根本上 没有任何错误。

Is the custom collection thread-safe?

"Thread safe" 是一个模糊的术语。但总的来说,我会说 "yes"。您的 class 根本不维护自己的任何状态,而是将所有状态委托给 class, 线程安全的。因此,对于通常的线程安全问题,class 状态本身应该没问题。

请注意,TryUpdate() 方法也会修改传入的对象,不是 以线程安全的方式完成。但这更多是关于该对象的线程安全性,而不是您的集合的线程安全性。

Is inheriting a concurrent collection ever acceptable? Like so class ItemCollection : ConcurrentDictionary and if so what are some guidelines, similar to this for inheriting from non-concurrent collections.

总是"acceptable"继承一个非密封的class。这样做是否有用是另一回事。当继承 class 具有有用的受保护 and/or 虚拟成员时,继承最有用,派生 class 可以使用这些虚拟成员实际扩展或修改继承 class 的行为。

否则,扩展方法通常是更好的方法。

无论如何,我不认为集合继承的指南会因集合是否线程安全而有很大差异。

How do you implement forwarding methods for methods like Select? I tried a series of variations like the following but can't get it to work:

"Methods like Select()" 作为扩展方法实现,并依赖对象本身实现 IEnumerable<T>(对于某些此类方法,IEnumerable 就足够了)。如果您希望自定义集合能够使用这些方法,则必须为要与 class.

一起使用的扩展方法实现适当的接口

自然地,在你的接口实现中,你可以将实际操作委托给封装的集合。