Я получаю сообщение об ошибке при зацикливании массива из асинхронного метода как Parallel. При отладке я вижу, что количество resultsArray равно 11. Но после нескольких шагов он показал мне: «Исходный массив был недостаточно длинным». Могу я понять, в чем проблема моего кода?

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
    });
    ...
}
1
dbenbyeon 27 Июн 2020 в 18:31

1 ответ

Лучший ответ

List не является потокобезопасной коллекцией, которую вы пытаетесь обновить из нескольких потоков. Вы можете попробовать использовать ConcurrentBag в этом случае:

var products = new ConcurrentBag<Product>();
Result[] resultArray = await Manager.GetResultArray();
Parallel.ForEach(resultArray , result=> //Error here
{
    SomeMethod(result)); // SomeMethod should add to ConcurrentBag
});
...
0
Guru Stron 27 Июн 2020 в 16:07