I am using the below code
var processed = new List<Guid>();
Parallel.ForEach(items, item =>
{
processed.Add(SomeProcessingFunc(item));
});
Is the above code thread safe? Is there a chance of processed list getting corrupted? Or should i use a lock before adding?
var processed = new List<Guid>();
Parallel.ForEach(items, item =>
{
lock(items.SyncRoot)
processed.Add(SomeProcessingFunc(item));
});
thanks.
No! It is not safe at all, because
processed.Add
is not. You can do following:Keep in mind that
Parallel.ForEach
was created mostly for imperative operations for each element of sequence. What you do is map: project each value of sequence. That is whatSelect
was created for.AsParallel
scales it across threads in most efficient manner.This code works correctly:
but makes no sense in terms of multithreading.
lock
ing at each iteration forces totally sequential execution, bunch of threads will be waiting for single thread.