List <t>是否可以线程安全地阅读?</t>

时间:2011-08-05 11:52:41

标签: c# list parallel-processing

以下伪代码是否是线程安全的?

IList<T> dataList = SomeNhibernateRepository.GetData();

Parallel.For(..i..)
{
    foreach(var item in dataList)
    {
       DoSomething(item);
    }
}

列表永远不会改变,它只是迭代并且并行读取。不写字段或类似的东西。

感谢。

4 个答案:

答案 0 :(得分:44)

是的,List<T>可以同时从多个线程读取,只要没有写入。

来自the documentation

  

只要未修改集合,List<T>可以同时支持多个阅读器。

编辑:请注意,您的代码必然使用List<T> - 只需IList<T>。你知道GetData()返回的类型吗?如果您控制GetData(),您可能希望记录它返回的列表是否可以线程安全地读取,如果它实际返回List<T>

答案 1 :(得分:3)

只要DoSomething(item)不修改dataList,它就完全是线程安全的。既然你说它没有,那么是的,这是线程安全的。

答案 2 :(得分:1)

确保没有人会更改您的列表,您可以通过IEnumerable

访问它
IEnumerable<T> dataList = SomeNhibernateRepository.GetData();

Parallel.For(..i..)
{
    foreach(var item in dataList)
    {
       DoSomething(item);
    }
}

答案 3 :(得分:0)

如果你说的是正确的那么我会这样说。但你所说或所想的可能不是现实中发生的事情。你怎么能在代码中说出你所说的话。如何强制执行List永远不会被修改的约束?