1

我正在创建一个封装 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>,有什么准则,类似于从非并发集合继承的准则。
  • 您如何为 Select 等方法实现转发方法?我尝试了以下一系列变体,但无法使其正常工作:

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

如果我继承 ConcurrentDictionary 它会导致类似的实现 在此处输入图像描述

4

1 回答 1

1

这个问题接近于“太宽泛”。也就是说,可以提供一些基本的答案。要了解更多细节,您必须进一步缩小问题范围,一次处理更小、更具体的问题,最好单独提出这些问题。

同时:

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

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

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

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

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

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

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

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

无论如何,我不希望集合继承的指导会根据集合是否是线程安全的而有很大差异。

您如何为 Select 等方法实现转发方法?我尝试了以下一系列变体,但无法使其正常工作:

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

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

于 2015-07-07T21:42:01.570 回答