开发一个MVC 5应用程序,它调用外部Web服务来获取数据并保存到我的数据库中。外部Web服务具有异步方法,因此我想在服务层上使用异步方法。
我将解决方案升级到.NET 4.5.2以利用HostingEnvironment.QueueBackgroundWorkItem
所以我的MVC控制器有以下内容:
HostingEnvironment.QueueBackgroundWorkItem(async cancellationToken =>
{
await _myService.AddCars(cars);
});
}.
return RedirectToAction("Index", "Home");
外部Web服务客户公司告诉我,如果传入的汽车数量少于1000,我可以按原样运行 - 如果超过1000,最好分成1000个包,最多运行5个平行。
显示MVC控制器命中的方法AddCars:
public async Task AddCars(List<Car> cars)
{
if (cars.Count > 1000)
{
const int packageSize = 1000;
var packages = SplitCars(cars, packageSize);
//await Task.WhenAll(packages.Select(RunCarExternalServiceAndWriteResponseToDb));
}
else
{
await RunCarExternalServiceAndWriteResponseToDb(cars);
}
}
我已经注释了await Task.WhenAll我想我可能需要这样的东西 - 我需要的是,如果有3000辆汽车进入 - 这被分成3个包1000个然后Ran并行 - 如果有的话例如7000是 - 这将分为7个1000个包,其中5个并行运行 - 一旦5个并行返回1000个并行运行的1000个包 - 然后如果例如12,000个车被传入 - 分成12个包1000个 - 第一批5 * 1000并行运行,然后第2批5 * 1000并行运行,最后第3批2 * 1000并行运行
有人能建议一个很好的方法来实现这个目标吗?
注意 - 我的RunCarExternalServiceAndWriteResponseToDb方法在这里被标记为异步方法,它调用实际的外部WebService方法 - 总共3个 - WCF外部服务调用 - 在每个方法中创建一个新的客户端,如果为null并且在最后阻止客户端关闭并设置为null