I am using the below code
var processed = new List();
Parallel.ForEach(items, item =>
{
processed.Add(SomeProcessingFunc(item));
});
reading is thread safe, but adding is not. You need a reader/writer lock setup as adding may cause the internal array to resize which would mess up a concurrent read.
If you can guarantee the array won't resize on add, you may be safe to add while reading, but don't quote me on that.
But really, a list is just an interface to an array.