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在将控制权交还给循环之前等待作业完成,而不是允许所有作业启动.
我有两个问题:
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)
| 归档时间: |
|
| 查看次数: |
25555 次 |
| 最近记录: |