I'm trying to run multiple functions that connect to a remote site (by network) and return a generic list. But I want to run them simultaneously.
For example:
public static List<SearchResult> Search(string title)
{
//Initialize a new temp list to hold all search results
List<SearchResult> results = new List<SearchResult>();
//Loop all providers simultaneously
Parallel.ForEach(Providers, currentProvider =>
{
List<SearchResult> tmpResults = currentProvider.SearchTitle((title));
//Add results from current provider
results.AddRange(tmpResults);
});
//Return all combined results
return results;
}
As I see it, multiple insertions to 'results' may happend at the same time... Which may crash my application.
How can I avoid this?
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.