并行启动一系列任务?

时间:2014-05-20 09:02:14

标签: c# .net asynchronous

开发一个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

0 个答案:

没有答案