可以在ToList()期间由另一个线程修改集合

时间:2015-04-14 17:30:58

标签: c# .net

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);
    }
}

我在多线程环境中遇到类似上述的情况,多个线程同时访问AddRemoveList

在某些情况下,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

1 个答案:

答案 0 :(得分:8)

List<T>中没有多线程保护,所以是的,另一个线程可以在ToList调用期间修改列表。结果可能是:

  • 一切都很好,结果列表有新值
  • 一切都很好,结果列表没有新值
  • 它会使您的硬盘处于激活状态(或其他未定义的行为)

基本上,在没有外部同步的情况下从多个线程使用List<T>安全,除非 all 线程只是从中读取。您需要同步(例如,使用SynchronizedCollection<T>代替List<T>,或自己处理同步),或同时收集集合,例如ConcurrentBag<T>