Недопустимое количество списков при установке точки останова вне параллели.инструкция 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 ответ:
List
это не потокобезопасно, поэтому вы не можете использовать его в параллельном коде. Вы должны использоватьConcurrentBag
(или любой другой потокобезопасной коллекции) вместо этого:var bag = new ConcurrentBag<int>(); Parallel.ForEach(myList, x => { bag.Add(x); });
Вы также можете использовать
lock
вокругnewList
, но это сделает распараллеливание бесполезным.