Недопустимое количество списков при установке точки останова вне параллели.инструкция foreach


Я понимаю это, когда использую TPL Parallel.Например, нам не нужно явно писать код, чтобы "ждать" завершения задач внутри него. Однако я делаю простой перенос 1000 элементов из исходного списка в список назначения. При установке точки останова снаружи и после параллели.Для каждого цикла я вижу недопустимое / неполное количество элементов в списке назначения... Почему?

List<int> myList = new List<int> { };
for (int i = 0; i < 1000; i++) {
    myList.Add(i);
}
List<int> newList = new List<int>();
Parallel.ForEach(myList, x => {
    newList.Add(x);
});
Thread.Sleep(5000);
var test = newList.Count;
1 2

1 ответ:

List это не потокобезопасно, поэтому вы не можете использовать его в параллельном коде. Вы должны использовать ConcurrentBag (или любой другой потокобезопасной коллекции) вместо этого:

var bag = new ConcurrentBag<int>();
Parallel.ForEach(myList, x =>
{
    bag.Add(x);
});

Вы также можете использовать lock вокруг newList, но это сделает распараллеливание бесполезным.