c# – 异步和等待与循环

前端之家收集整理的这篇文章主要介绍了c# – 异步和等待与循环前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Using async/await for multiple tasks3
我有一个Windows服务,根据计划运行各种工作.在确定要运行哪些作业之后,会将一个调度对象列表发送到迭代列表并运行每个作业的方法.问题是由于外部数据库调用,某些作业最多可能需要10分钟才能运行.

我的目标是没有一个工作阻止其他人排队,基本上一次有多个运行.我以为使用异步和等待可以解决这个问题,但是我从来没有使用过这些.

当前代码

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;
}

我尝试更新到这段代码

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;
}

问题是第一个LoadAsync等待作业完成,然后再将控制权重新回到循环,而不是允许所有作业启动.

我有两个问题:

>高级 – 是否等待最佳选择,还是应该采用不同的方法
>什么需要更新以允许循环启动所有的作业而不阻止,但不允许该功能返回,直到所有作业完成?

解决方法

High Level – Are async/await the best choice,or should I use a different approach?

异步等待是您尝试做的完美的,同时卸载多个IO绑定任务.

What needs to be updated to allow the loop to kick off all the jobs without blocking,but not allow the function to return until all jobs are completed?

您的循环当前等待,因为您等待每次调用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;
}
原文链接:https://www.f2er.com/csharp/97109.html

猜你在找的C#相关文章