.NET异步执行Power BI转图片任务未全部并行问题咨询
问题描述
我有一个异步方法,用于在云端运行多个任务将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%,请问该现象成因是什么?是否有办法确保所有任务同时执行?
问题分析与解决
成因分析
- 线程池调度限制:.NET线程池默认会动态调整线程数量,但线程注入速率有上限(默认每500ms新增一个线程)。如果
PowerBiTask内部存在同步阻塞操作(比如调用Power BI API时用了同步方法、直接调用.Result/.Wait()),会持续占用线程池线程,当可用线程耗尽后,后续任务只能等待线程释放,表现为串行执行。 - Power BI API并发限制:Power BI服务本身对单个租户/应用的并发请求数有阈值,当请求量达到上限后,后续请求会被服务端排队处理,并非本地资源不足导致。
- 数据库操作隐性阻塞:循环中获取filters的数据库操作如果是同步实现,会提前占用部分线程池资源,拖慢后续任务的启动速度。
解决办法
- 保证
PowerBiTask是纯异步实现:检查PowerBiTask内部是否使用了Power BI SDK的异步API(带Async后缀的方法),彻底避免在异步方法内使用同步阻塞调用,让线程池线程能及时释放处理更多任务。 - 调整线程池初始配置:在程序启动时设置足够的线程池最小线程数,跳过线程池缓慢注入线程的阶段,示例:
注意:设置值不要超过系统实际承载能力,避免资源过载。ThreadPool.SetMinThreads(100, 100); - 通过信号量控制并发并适配API限制:如果是Power BI API的并发阈值导致,先确认官方文档给出的上限,再用
SemaphoreSlim控制并发任务数,避免被服务端排队,示例:var semaphore = new SemaphoreSlim(50); // 根据API限制调整数值 foreach (var eximg in db.ExportImageIdsDetails.OrderBy(x => x.Id).ToList()) { await semaphore.WaitAsync(); var task = PowerBiTask(filters).ContinueWith(t => { semaphore.Release(); return t.Result; }); tasks.Add(task); } - 优化数据库操作:将获取filters的同步数据库操作改为异步版本(比如
await db.Filters.Where(...).ToListAsync()),避免在循环中阻塞线程池线程。
内容的提问来源于stack exchange,提问作者counterhash
相关产品推荐
相关产品推荐

