在这里谈论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
}
}
}
答案 0 :(得分:23)
是的,List<T>
可以安全地从多个线程读取,只要没有线程修改列表。
来自the docs:
List<T>
可以支持多个 读者兼并,只要 集合未被修改。 列举一个集合是 本质上不是线程安全的 程序。在罕见的情况下 枚举与一个或多个竞争 写访问,唯一的方法来确保 线程安全是锁定 整个收集 列举。允许收集 由多个线程访问 读书和写作,你必须 实现自己的同步。
(关于迭代“本质上不是一个线程安全的程序”的观点是关于改变列表的其他东西。)
答案 1 :(得分:0)
你可以使用foreach()获得的迭代器就好了多个线程。只要你不在列表中添加或删除元素,你应该没问题。我相信你甚至可以修改你的任何成员,但这会带你进入非线程安全的领域。