Я получаю сообщение об ошибке при зацикливании массива из асинхронного метода как 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 ответ
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
});
...
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.