Search code examples
c#parallel.foreach

Parallel Foreach array from async method


I am getting an error when looping array from async method as Parallel. When debuging, I can see count of the resultsArray is 11. But after stepping over a few times, it showed me "Source array was not long enough" Can I please get what the issue of my code?

public async Task<IActionResult> Generate(int id)
{
   List<Product> products = new List<Product>();
    Result[] resultArray = await Manager.GetResultArray();
    Parallel.ForEach(resultArray , result=> //Error here
    {
        SomeMethod(result)); // SomeMethod cast result to Produc class and add to products list
    });
    ...
}

Solution

  • List is not an thread safe collection, which you are trying to update from multiple threads. You can try to use ConcurrentBag in this case:

    var products = new ConcurrentBag<Product>();
    Result[] resultArray = await Manager.GetResultArray();
    Parallel.ForEach(resultArray , result=> //Error here
    {
        SomeMethod(result)); // SomeMethod should add to ConcurrentBag
    });
    ...