最近想对服务调用列表进行健康检查。它们都是异步任务(例如 Task<IHttpOperationResponse<XXX_Model>> method_name(...)
我想将它们全部放入一个列表中。我遵循了这篇文章的答案:Storing a list of methods in C#但是,它们是异步方法。
我是这样写的: 异步方法的集合
List<Action> _functions = new List<Action> {
() => accountDetailsServiceProvider.GetEmployer(EmployerId),
() => accountServiceProvider.GetAccountStatus(EmployerId)
}
谁能告诉我正确的方法来实现将异步方法放入列表并迭代调用它们?
提前致谢!
最佳答案
首先,您需要使您的方法异步。这意味着他们必须返回一个任务。例如:
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,而不是一个 Action 。它返回一个任务。
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!
如果您的方法返回 bool 值,则返回类型变为 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();
关于c# - 如何将异步方法放入列表中并迭代调用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54208894/