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);
}
}
Run Code Online (Sandbox Code Playgroud)
我在多线程环境中遇到类似于上面的情况Add,Remove并且List同时由多个线程访问.
在某些情况下Collection was modified; enumeration operation may not execute会抛出Listgetter,这在线程可以在Select/Where操作执行时添加/删除时有意义.
在调用期间,列表是否可以被另一个线程修改ToList()?意思是,会改变吸气剂
return _list.ToList().Select(p => p + p).Where(q => q % 2 == 0);
Run Code Online (Sandbox Code Playgroud)
够了,还是我需要求助于锁定 _list
没有多线程保护List<T>,所以是的,另一个线程可以在ToList通话期间修改列表.结果可能是:
基本上,它是不是安全使用List<T>多个线程没有外部同步,除非所有线程都只是从中读取.您需要同步(例如,使用SynchronizedCollection<T>代替List<T>,或自己处理同步),或者并发集合,例如ConcurrentBag<T>.