Я запускаю этот кусок кода в моем приложении.
public Task<BulkResponse<JObject>> GetRelatedObjectsAsync(IEnumerable<PrimaryObjectInfo> primaryObjectInfos)
{
var allSecondaries = new List<Tuple<int, List<JObject>>>();
var exceptionsDict = new ConcurrentDictionary<int, Exception>();
var relatedObjectsTasks = primaryObjectInfos.Select(async primaryObjectInfo =>
{
try
{
var secondaryObject = await objectManager.GetRelatedObjectsAsync(primaryObjectInfo);
allSecondaries.Add(Tuple.Create(primaryObjectInfo.Index, secondaryObject.ToList()));
}
catch (Exception ex)
{
exceptionsDict.TryAdd(primaryObjectInfo.Index, ex);
}
});
await Task.WhenAll(relatedObjectsTasks);
return ConvertToBulkResponse(allSecondaries, exceptionsDict);
}
Когда я запускаю этот код, allSecondaries
объект иногда возвращает действительный список результатов, а иногда код заканчивает тем, что ловит исключения для параллельных потоков, которые у меня есть для каждого primaryObjectInfo
.
Асинхронный метод objectManager.GetRelatedObjectsAsync()
внутренне вызывает 4-5 асинхронных функций, и есть функции, в которых параметры передаются по ссылке. (ключевое слово ref)
Вопрос:
Использую ли я правильную структуру данных для консолидации результатов всех параллельных потоков?
Если да, с какой стати я каждый раз получаю разные результаты?