比方说,我想创建一个默认情况下线程安全的集合类。是否有可能从T []获得IEnumerator <T>?
该类在内部具有名为Values
的受保护的List<T>
属性。
对于初学者来说,让班级实施ICollection<T>
是有意义的。这个接口的一些成员很容易实现;例如,Count
返回this.Values.Count
。
但是执行ICollection<T>
需要我执行IEnumerable<T>
以及IEnumerable
(非泛型),这对于线程安全集合来说有点棘手。
当然,我总是可以在IEnumerable<T>.GetEnumerator
和IEnumerable.GetEnumerator
上抛出一个NotSupportedException
,但是这对我来说就像是一个警察。
我已经有一个线程安全的getValues
函数,它锁在Values
上,并以T[]
数组的形式返回一个副本。所以我的想法是通过返回this.getValues().GetEnumerator()
实现GetEnumerator
,使下面的代码实际上是线程安全的:
ThreadSafeCollection coll = new ThreadSafeCollection();
// add some items to coll
foreach (T value in coll) {
// do something with value
}
不幸的是这个实现似乎只为IEnumerable.GetEnumerator
工作,而不是通用版本(所以上面的代码抛出一个InvalidCastException
)。
我有一个想法,这似乎工作,是要求它GetEnumerator
之前,从getValues
铸T[]
返回值的IEnumerable<T>
。另一种方法是将getValues
更改为首先返回IEnumerable<T>
,但对于非通用IEnumerable.GetEnumerator
只是将返回值从getValues
转换为非泛型IEnumerable
。但我不能真正决定这些方法是否草率或完全可以接受。
在任何情况下,有没有人有更好的想法如何去做这件事?我听说过.Synchronized
方法,但它们似乎只适用于System.Collections
命名空间中的非泛型集合。也许有一个这种已经存在于.NET中的通用变体,我根本不知道?
你可以只使用SynchronizedCollection ...对? – 2009-10-15 14:46:15
不幸的是,目前我们在这里遇到了.NET 2.0和VS 2005。看起来SynchronizedCollection在.NET 3.0中变得可用。 – 2009-10-15 14:54:13