两个或多个线程可以在同一个List <t>上迭代而没有任何问题吗?

Cod*_*per 12 c# multithreading

System.Collections.Generic.List<T>这里谈论.

用下面的例子可以同时执行Method1和Method2,在不同的线程上没有任何问题?

谢谢

class Test
{
    private readonly List<MyData> _data;

    public Test()
    {
        _data = LoadData();
    }

    private List<MyData> LoadData()
    {
        //Get data from dv.
    }

    public void Method1()
    {
        foreach (var list in _data)
        {
            //do something
        }
    }

    public void Method2()
    {
        foreach (var list in _data)
        {
            //do something
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 25

是的,只要没有线程正在修改列表,List<T>就可以安全地从多个线程读取.

来自文档:

A List<T>可以同时支持多个读取器,只要不修改集合即可.枚举通过集合本质上不是线程安全的过程.在枚举与一个或多个写访问争用的极少数情况下,确保线程安全的唯一方法是在整个枚举期间锁定集合.要允许多个线程访问集合以进行读写,您必须实现自己的同步.

(关于迭代"本质上不是一个线程安全的过程"的观点是关于改变列表的其他东西.)