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);
}
}
- 以这种方式封装并发集合是否可以接受,或者这是否正在进入从通用集合创建您自己的线程安全集合的领域?
- 自定义集合是线程安全的吗?
- 继承并发集合是否可以接受?像这样
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,它会导致如下实现
问题接近 "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.
一起使用的扩展方法实现适当的接口
自然地,在你的接口实现中,你可以将实际操作委托给封装的集合。
我正在创建一个封装了 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);
}
}
- 以这种方式封装并发集合是否可以接受,或者这是否正在进入从通用集合创建您自己的线程安全集合的领域?
- 自定义集合是线程安全的吗?
- 继承并发集合是否可以接受?像这样
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,它会导致如下实现
问题接近 "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.
自然地,在你的接口实现中,你可以将实际操作委托给封装的集合。