异步并等待For循环

Jos*_*osh 22 .net c# multithreading asynchronous async-await

我有一个Windows服务,根据计划运行各种作业.确定要运行的作业后,会将一个计划对象列表发送到迭代列表并运行每个作业的方法.问题是由于外部数据库调用,某些作业最多可能需要10分钟才能运行.

我的目标是没有一个工作阻止其他队列,基本上一次有多个运行.我认为使用async和await可以解决这个问题,但我以前从未使用过这些.

现行代码:

public static bool Load(List<Schedule> scheduleList)
{
    foreach (Schedule schedule in scheduleList)
    {
        Load(schedule.ScheduleId);
    }

    return true;
}

public static bool Load(int scheduleId)
{
    // make database and other external resource calls 
    // some jobs run for up to 10 minutes   

    return true;
}
Run Code Online (Sandbox Code Playgroud)

我尝试更新到这段代码:

public async static Task<bool> LoadAsync(List<Schedule> scheduleList)
{
    foreach (Schedule schedule in scheduleList)
    {
        bool result = await LoadAsync((int)schedule.JobId, schedule.ScheduleId);
    }

    return true;
}

public async static Task<bool> LoadAsync(int scheduleId)
{
    // make database and other external resource calls 
    // some jobs run for up to 10 minutes   

    return true;
}
Run Code Online (Sandbox Code Playgroud)

问题是第一个LoadAsync在将控制权交还给循环之前等待作业完成,而不是允许所有作业启动.

我有两个问题:

  1. 高水平 - aysnc /等待是最佳选择,还是应该采用不同的方法?
  2. 需要更新什么以允许循环启动所有作业而不阻塞,但不允许函数返回直到所有作业完成?

Yuv*_*kov 28

高级别 - 异步/等待是最佳选择,还是应该使用不同的方法?

async-await 非常适合您尝试执行的操作,同时卸载多个IO绑定任务.

需要更新什么以允许循环启动所有作业而不阻塞,但不允许函数返回直到所有作业完成?

您的循环当前等待,因为您await每次调用LoadAsync.你想要的是同时执行它们,而不是等待所有它们完成使用Task.WhenAll:

public async static Task<bool> LoadAsync(List<Schedule> scheduleList)
{
   var scheduleTaskList = scheduleList.Select(schedule => 
                          LoadAsync((int)schedule.JobId, schedule.ScheduleId)).ToList();
   await Task.WhenAll(scheduleTaskList);

   return true;
}
Run Code Online (Sandbox Code Playgroud)