【发布时间】:2012-06-18 14:55:05
【问题描述】:
我正在尝试找出最好的方法来拥有一个集合,我将能够同时从不同的线程中迭代、添加项目和删除所有项目。性能对于迭代组件至关重要,但不会经常添加和删除项目 - 因此添加/删除性能稍微不那么重要。
这是我想出的:
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 语句会更好吗?
【问题讨论】:
-
为什么不使用像
ConcurrentBag这样的现有并发列表? -
但是你能遍历并发包并同时添加/删除吗?
-
@L.B - 只是出于好奇 - 既然你们拥有 CodeReview 网站,StackOverflow 的权限是什么?
-
@William - 代码审查是为了获取一段工作代码并分析它以获得最佳实践。 Stack Overflow 用于解决编程相关的问题。
标签: c# multithreading collections