c# - 如何将异步方法放入列表中并迭代调用它们?

标签 c# arraylist async-await task

最近想对服务调用列表进行健康检查。它们都是异步任务(例如 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!

Example on DotNetFiddle

如果您的方法返回 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/

相关文章:

java - 如何在任意位置以 O(1) 的时间进行插入和读取?

node.js - 如何在 Vscode 的 Typescript 中等待后调试代码?

flutter - 'Future<Map<String, dynamic>> Function()' 循环中使用的类型 'for' 必须实现 Iterable - Flutter

c# - 我可以从 MethodDefinition (Cecil) 获取 MethodInfo 吗?

c# - 不在 Silverlight 中使用 ArrayList 的理由是什么?

java - 无法弄清楚为什么 System.out.println 不起作用

javascript - Reactjs async/await 在第一次运行时不起作用

c# - 托管 C++ 中的 List<Tuple<int, float>>

c# - Android HTTP 到 C# 服务器

c# - 如何自动同步sql行号和ID列