コレクションを反復処理し、アイテムを追加し、異なるスレッドから同時にすべてのアイテムを削除できるようにするための最良の方法を見つけようとしています。パフォーマンスはイテレーション コンポーネントにとって重要ですが、項目の追加と削除はあまり頻繁に行われないため、追加/削除のパフォーマンスはそれほど重要ではありません。
これが私が思いついたものです:
public class AtomicList<T> : IEnumerable<T>
{
private readonly object Locker = new object();
private List<T> InternalCollection = new List<T>();
public void Add(T Value)
{
lock (Locker)
{
List<T> Update = new List<T>(InternalCollection);
Update.Add(Value);
InternalCollection = Update;
}
}
public void Remove(T Value)
{
lock (Locker)
{
List<T> Update = new List<T>(InternalCollection);
Update.Remove(Value);
InternalCollection = Update;
}
}
public IEnumerator<T> GetEnumerator()
{
return InternalCollection.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
このようにすることの欠点はありますか?上記で説明したように、これがスレッドセーフ/反復可能ではない状況はありますか?
また、foreach と IEnumerable を使用するとパフォーマンス コストがかかりますか? InternalCollection に直接アクセスして for ステートメントを実行した方がよいでしょうか?