Я думаю, вы просто ищете что-то простое?
var myList = new List<Action>()
{
async() => { await Foo.GetBarAsync(); },
...
};
Я бы порекомендовал вам вместо этого изменить тип с
111 -async-lambdas /Action
наFunc<Task>
.blockquote>
Для вызова (упрощенно)
foreach (var action in myList) { await action.Invoke(); }
Во-первых, вам нужно сделать ваши методы асинхронными. Это означает, что они должны вернуть задание. Например:
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!
Если ваши методы возвращают логическое значение, , тогда тип возвращаемого значения становится 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();