Во-первых, вам нужно сделать ваши методы асинхронными. Это означает, что они должны вернуть задание. Например:
public static async Task Foo()
{
await Task.Delay(1);
Console.WriteLine("Foo!");
}
public static async Task Bar()
{
await Task.Delay(1);
Console.WriteLine("Bar!");
}
Затем, чтобы поместить их в список, вы должны определить список как содержащий правильный тип. Поскольку асинхронный метод на самом деле что-то возвращает, это Func, а не действие. Возвращает задание.
var actions = new List<Func<Task>>
{
Foo, Bar
};
Чтобы вызвать их, выберите над списком (используя Linq), чтобы вызвать их. Это создает список задач вместо списка функций.
var tasks = actions.Select( x => x() );
Тогда просто жди их:
await Task.WhenAll(tasks);
Полный пример:
public static async Task MainAsync()
{
var actions = new List<Func<Task>>
{
Foo, Bar
};
var tasks = actions.Select( x => x() );
await Task.WhenAll(tasks);
}
Выход:
Foo!
Bar!
Пример для DotNetFiddle
Если ваши методы возвращают логическое значение, , тогда тип возвращаемого значения становится Task<bool>
, а остальные следуют его примеру:
public static async Task<bool> Foo()
{
await Task.Delay(1);
Console.WriteLine("Foo!");
return true;
}
public static async Task<bool> Bar()
{
await Task.Delay(1);
Console.WriteLine("Bar!");
return true;
}
var actions = new List<Func<Task<bool>>>
{
Foo, Bar
};
var tasks = actions.Select( x => x() );
await Task.WhenAll(tasks);
После того, как вы ожидаете их, вы можете преобразовать задачи в их результаты с помощью еще одного оператора LINQ:
List<bool> results = tasks.Select( task => task.Result ).ToList();