Подтвердить что ты не робот

Может ли два или более потока проходить через один и тот же список <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
        }
    }
}
4b9b3361

Ответ 1

Да, List<T> безопасен для чтения из нескольких потоков, если нити не изменяют список.

От документы:

A List<T> может поддерживать несколько читателей одновременно, пока коллекция не модифицировано. Перечисление через коллекцию по существу не является потокобезопасным процедура. В редком случае, когда перечисление связано с одним или несколькими доступа к записи, единственный способ обеспечить безопасность потока - это блокировка сбор в течение всего перечисление. Чтобы обеспечить сбор для доступа к нескольким потокам для чтении и письме, вы должны выполнить собственную синхронизацию.

(Дело в том, что итерация "по сути не является потокобезопасной процедурой" выполняется в отношении чего-то другого, изменяющего список.)

Ответ 2

Вы можете использовать итераторы, полученные с помощью foreach(), только отлично для нескольких потоков. До тех пор, пока вы не добавите или не удалите элементы из списка, вы должны быть в порядке. Я считаю, что вы даже можете изменить членов своего, но это приведет вас к небезобезопасной территории.