继承/封装并发集合c#

时间:2015-07-07 15:20:31

标签: c# inheritance concurrency encapsulation concurrent-collections

我正在创建一个封装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来继承非并发集合。
  • 如何为Select等方法实现转发方法?我尝试了以下一系列变体,但无法使其发挥作用:

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

如果我继承ConcurrentDictionary,它会产生类似的实现 enter image description here

1 个答案:

答案 0 :(得分:1)

这个问题接近于“过于宽泛”。也就是说,可以提供一些基本答案。有关更多详细信息,您必须进一步缩小问题范围,一次处理更小,更具体的问题,并且最好单独提出这些问题。

与此同时:

  

以这种方式封装并发集合是否可以接受,或者是否正在进入从通用集合创建自己的线程安全集合的领域?

“可接受”是一个广泛的概念,但是......是的,这种方法没有从根本上错误。

  

自定义集合是否是线程安全的?

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

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

  

继承并发集合是否可以接受?像这样的类ItemCollection:ConcurrentDictionary,如果有的话,什么是一些指南,类似于继承非并发集合。

继承非密封类始终是“可接受的”。是否有用这样做是另一回事。当继承的类具有有用的受保护和/或虚拟成员(派生类可用于实际扩展或以其他方式修改继承类的行为)时,继承最有用。

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

在任何情况下,我都不希望收集的继承指南会有很大差异,具体取决于集合是否是线程安全的。

  

如何为Select等方法实现转发方法?我尝试了一系列变体,如下所示,但无法使其发挥作用:

“像Select()这样的方法”被实现为扩展方法,并依赖于实现IEnumerable<T>的对象本身(对于某些此类方法,IEnumerable已经足够了)。如果您希望自定义集合能够使用这些方法,则必须为要与您的类一起使用的扩展方法实现适当的接口。

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