Нет!Это совсем не безопасно, потому что processed.Add
нет.Вы можете сделать следующее:
items.AsParallel().Select(item => SomeProcessingFunc(item)).ToList();
Имейте в виду, что Parallel.ForEach
был создан главным образом для обязательных операций для каждого элемента последовательности.То, что вы делаете, это карта: проецируйте каждое значение последовательности.Для этого и была создана Select
.AsParallel
наиболее эффективно масштабирует его по потокам.
Этот код работает правильно:
var processed = new List<Guid>();
Parallel.ForEach(items, item =>
{
lock(items.SyncRoot)
processed.Add(SomeProcessingFunc(item));
});
, но не имеет смысла в смысле многопоточностиlock
Если на каждой итерации выполняется полностью последовательное выполнение, группа потоков будет ожидать один поток.