Я исправил точно такую же ошибку раньше.
Список не является потокобезопасным.
При одновременном добавлении элементов внутренний указатель списка может запутаться и привести к тому, что элемент вернет ноль, даже если было добавлено ненулевое значение.
Это приводит к возникновению проблемы:
var list = new List<object>();
var listOfTasks = new List<Task>();
for (var i = 0; i < 10; i++)
{
listOfTasks.Add(Task.Factory.StartNew(() => list.Add(new object())));
}
Task.WaitAll(listOfTasks.ToArray());
Использование списка безопасного потока решит проблему. Но я бы изменил задачу, чтобы вернуть результат, а не добавляя это к списку. Затем используйте LINQ или Task.WhenAll
, чтобы получить эти результаты.
var listOfTasks = new List<Task<object>>();
for (var i = 0; i < 10; i++)
{
listOfTasks.Add(Task.Factory.StartNew(() => new object()));
}
var list = await Task.WhenAll(listOfTasks.ToArray());
// OR
Task.WaitAll(listOfTasks.ToArray());
var list = listOfTasks.Select(t => t.Result).ToList();