如何将异步方法放在列表中并迭代调用它们?

特伦斯

最近,我想对服务呼叫列表实施健康检查。它们都是异步任务(例如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!

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();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将异步方法拆分为较小的部分并依次调用它们?

如何将异步任务存储在字典中并根据配置值调用它们?

如何将方法调用存储到Ruby中的数组中,而不是调用它们

PHP如何将变量存储在数组中并调用它们

如何将函数引用传递到方法中并使用它们?

如何在HashMap中存储方法指针并调用它们

OpenCV:如何将图像保存在一个大矩阵中,然后分别调用它们?

调用方法以及如何使用它们

如何将 ParseQuery 放在单独的类中并在 android 的每个活动中调用此方法?

TypeScript:如何将已区分的并集中的对象映射到可以调用它们的函数?

如何将异步Func或Action转换为委托并调用它

如何将列表视图放在SingleChildScrollView内,但防止它们分别滚动?

如何将多个词典放在列表中

将方法存储在数组中并在C#中调用它们

如何将本地子程序名称存储在数组中,并以库卡机器人语言在循环访问所述数组的循环中调用它们

如何将方法从使用它们的模块传递给服务?(ruby)

如何将图像包含到javadoc中并引用它们

Ruby on Rails - 集成现有项目 - 将 css/js 文件放在哪里并调用它们?

如何将reduce函数的每个迭代存储在列表中?

如何将循环迭代结果存储到列表中?

如何将异步迭代器视为同步迭代器?

将整数保存在泡菜中并调用它们

如何将扩展方法放在库中?

如何将匿名列表传递给静态方法中的调用方法?

Javascript:函数中的数组以及如何调用它们

如何将链表作为参数传递给方法,以及如何调用它?

如何将数据存储在二维arraylist中并使用double迭代器显示它们?

如何将数据存储在单个文件中并在视图文件中调用它?

如何将jQuery“ fancybox”插件值放在array \ variable中,并在以后使用javascript使用它?