Parallel.ForEach with adding to list
Solution 1:
You can use a concurrent collection.
The
System.Collections.Concurrent
namespace provides several thread-safe collection classes that should be used in place of the corresponding types in theSystem.Collections
andSystem.Collections.Generic
namespaces whenever multiple threads are accessing the collection concurrently.
You could for example use ConcurrentBag
since you have no guarantee which order the items will be added.
Represents a thread-safe, unordered collection of objects.
Solution 2:
//In the class scope:
Object lockMe = new Object();
//In the function
lock (lockMe)
{
results.AddRange(tmpResults);
}
Basically a lock means that only one thread can have access to that critical section at the same time.
Solution 3:
For those who prefer code:
public static ConcurrentBag<SearchResult> Search(string title)
{
var results = new ConcurrentBag<SearchResult>();
Parallel.ForEach(Providers, currentProvider =>
{
results.Add(currentProvider.SearchTitle((title)));
});
return results;
}