I have refactored a Web API to rely on async/await in ASP.NET Core 3.1 and I have the following scenario: a statistics method is sequentially computing a list of indicators which are defined in a list.
readonly Dictionary<StatisticItemEnum, Func<Task<SimpleStatisticItemApiModel>>> simpleItemActionMap =
    new Dictionary<StatisticItemEnum, Func<Task<SimpleStatisticItemApiModel>>>();
private void InitSimpleStatisticFunctionsMap()
{
    simpleItemActionMap.Add(StatisticItemEnum.AllQuestionCount, GetAllQuestionCountApiModel);
    simpleItemActionMap.Add(StatisticItemEnum.AllAnswerCount, GetAllAnswerCountApiModel);
    simpleItemActionMap.Add(StatisticItemEnum.AverageAnswer, GetAverageAnswer);
    // other mappings here
}
private async Task<SimpleStatisticItemApiModel> GetAllQuestionCountApiModel()
{
    // await for database operation
}
private async Task<SimpleStatisticItemApiModel> GetAllAnswerCountApiModel()
{
    // await for database operation
}
private async Task<SimpleStatisticItemApiModel> GetAverageAnswer()
{
    // await for database operation
}
The code sequentially goes through each item and computes it and after the refactoring it is looking like this:
itemIds.ForEach(itemId =>
{
    var itemEnumValue = (StatisticItemEnum) itemId;
    if (simpleItemActionMap.ContainsKey(itemEnumValue))
    {
        var result = simpleItemActionMap[itemEnumValue]().Result;
        payload.SimpleStatisticItemModels.Add(result);
    }
}); 
I know that Task.Result might lead to deadlocks, but I could not find any other way to make this work.
Question: How to execute a dynamic list of async functions in a sequential way?
 
     
    