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

时间:2010-04-14 13:11:53

标签: 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
        }
    }
}

2 个答案:

答案 0 :(得分:23)

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

来自the docs

  

List<T>可以支持多个   读者兼并,只要   集合未被修改。   列举一个集合是   本质上不是线程安全的   程序。在罕见的情况下   枚举与一个或多个竞争   写访问,唯一的方法来确保   线程安全是锁定   整个收集   列举。允许收集   由多个线程访问   读书和写作,你必须   实现自己的同步。

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

答案 1 :(得分:0)

你可以使用foreach()获得的迭代器就好了多个线程。只要你不在列表中添加或删除元素,你应该没问题。我相信你甚至可以修改你的任何成员,但这会带你进入非线程安全的领域。