.NET 任务在开始之前等待其他任务完成

问题描述 投票:0回答:1

我有一个异步方法,可以运行多个任务来将 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% 负载。

asp.net asynchronous
1个回答
0
投票

要完全回答您的问题,您需要提供

PowerBiTask(filters)
的实现。但据我所知,我建议阅读以下内容:可用于任务的最大线程数

线程池大小最初设置为机器上的物理核心数量,如果您进行大量计算工作,增加这可能会给您带来更高程度的并行性。

重要注意事项:进行测量,在某些情况下,同步执行可能比使用更多并行性更快。

© www.soinside.com 2019 - 2024. All rights reserved.