class Sample
{
private List<int> _list;
public List<int> List
{
get
{
return _list.Select(p => p + p).Where(q => q % 2 == 0).ToList();
}
}
public void Add(int n)
{
_list.Add(n);
}
public void Remove(int n)
{
_list.Remove(n);
}
}
我在多线程环境中遇到类似上述的情况,多个线程同时访问Add
,Remove
和List
。
在某些情况下,Collection was modified; enumeration operation may not execute
getter中会抛出List
,因为线程可以在执行Select / Where操作时添加/删除。
在调用ToList()
期间,列表是否可以被其他线程修改?意思是,将吸气剂更改为
return _list.ToList().Select(p => p + p).Where(q => q % 2 == 0);
够了,还是我需要求助于访问_list
答案 0 :(得分:8)
List<T>
中没有多线程保护,所以是的,另一个线程可以在ToList
调用期间修改列表。结果可能是:
基本上,在没有外部同步的情况下从多个线程使用List<T>
是不安全,除非 all 线程只是从中读取。您需要同步(例如,使用SynchronizedCollection<T>
代替List<T>
,或自己处理同步),或同时收集集合,例如ConcurrentBag<T>
。