我有一个异步方法,可以运行多个任务来将 Power BI 报告转换为图像,这是在云中完成的。该方法一次执行大约 60 个这样的任务:
public async Task Func()
{
var tasks = new List<Task<string>>();
var imgs = new List<ExportImageIdsDetail>();
try
{
foreach (var eximg in db.ExportImageIdsDetails.OrderBy(x => x.Id).ToList())
{
// retrieve filters from db omitted
imgs.Add(eximg);
var task = PowerBiTask(filters)
tasks.Add(task);
}
var exportIds = await Task.WhenAll(tasks);
DateTime timeUtc = DateTime.UtcNow;
TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime udate = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, easternZone);
for (var i = 0; i < exportIds.Length; i++)
{
if (!string.IsNullOrEmpty(exportIds[i]))
{
imgs[i].UpdatedDate = udate;
imgs[i].ExportImageId = exportIds[i];
}
}
db.SaveChanges();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
当我运行程序时,有时所有任务同时运行,但有时大约有 50 个任务同时运行,然后其余任务似乎同步运行(例如任务 51 运行 30 秒) ,然后任务 52 运行 30 秒...)。为什么会出现这种情况?有没有办法保证所有任务同时运行?任务管理器显示内存和 CPU 也仅处于 50% 负载。
要完全回答您的问题,您需要提供
PowerBiTask(filters)
的实现。但据我所知,我建议阅读以下内容:可用于任务的最大线程数。
线程池大小最初设置为机器上的物理核心数量,如果您进行大量计算工作,增加这可能会给您带来更高程度的并行性。
重要注意事项:进行测量,在某些情况下,同步执行可能比使用更多并行性更快。