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

Bor*_*ort 2 .net c#

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

Jon*_*eet 8

没有多线程保护List<T>,所以是的,另一个线程可以ToList通话期间修改列表.结果可能是:

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

基本上,它是不是安全使用List<T>多个线程没有外部同步,除非所有线程都只是从中读取.您需要同步(例如,使用SynchronizedCollection<T>代替List<T>,或自己处理同步),或者并发集合,例如ConcurrentBag<T>.

  • 实际上在让测试运行了一段时间之后,它抛出了`目标数组不够长.检查destIndex和长度,以及数组的下限.这足够接近我的硬盘设置.谢谢乔恩 (2认同)