我有一个 Windows 服务,它根据计划运行各种作业。确定要运行哪些作业后,将调度对象列表发送到迭代列表并运行每个作业的方法。问题是,由于外部数据库调用,某些作业可能需要长达 10 分钟才能运行。
我的目标是不让一项作业阻塞队列中的其他作业,基本上一次运行多个作业。我认为使用 async 和 wait 可以解决这个问题,但我以前从未使用过它们。
当前代码:
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 会等待作业完成,然后再将控制权交还给循环,而不是允许所有作业启动。
我有两个问题:
- 高级 - async/await 是最佳选择,还是应该使用不同的方法?
- 需要更新什么才能允许循环在不阻塞的情况下启动所有作业,但不允许函数在所有作业完成之前返回?
高级 - async/await 是最佳选择,还是应该使用不同的方法?
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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)