Может ли два или более потока проходить через один и тот же список <t> без каких-либо проблем?
Говоря о 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
}
}
}
Ответы
Ответ 1
Да, List<T>
безопасен для чтения из нескольких потоков, если нити не изменяют список.
От документы:
A List<T>
может поддерживать несколько читателей одновременно, пока коллекция не модифицировано. Перечисление через коллекцию по существу не является потокобезопасным процедура. В редком случае, когда перечисление связано с одним или несколькими доступа к записи, единственный способ обеспечить безопасность потока - это блокировка сбор в течение всего перечисление. Чтобы обеспечить сбор для доступа к нескольким потокам для чтении и письме, вы должны выполнить собственную синхронизацию.
(Дело в том, что итерация "по сути не является потокобезопасной процедурой" выполняется в отношении чего-то другого, изменяющего список.)
Ответ 2
Вы можете использовать итераторы, полученные с помощью foreach(), только отлично для нескольких потоков. До тех пор, пока вы не добавите или не удалите элементы из списка, вы должны быть в порядке. Я считаю, что вы даже можете изменить членов своего, но это приведет вас к небезобезопасной территории.