最近,我想对服务呼叫列表实施健康检查。它们都是异步任务(例如Task<IHttpOperationResponse<XXX_Model>> method_name(...)
我想将所有这些都放入列表中。我遵循了这篇文章的答案:在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,而不是一个动作。它返回一个任务。
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();
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句