C#中Parallel.Invoke返回值及多Sheet Excel生成并行实现咨询
使用C# Parallel.Invoke并行执行数据获取方法并处理返回值
没问题,我来帮你把串行代码改成并行执行,同时处理好每个方法的返回值!
核心思路
Parallel.Invoke的作用就是让多个独立操作并行执行,它会自动等待所有操作完成后再继续后续逻辑。你的四个方法都是独立从数据库拉取数据,且结果要赋值到同一个CAMSFormat对象的不同属性里——每个委托只负责一个属性的赋值,不存在多线程竞争同一资源的问题,直接这么做非常安全。
改造后的代码示例
// 先初始化CAMS对象 CAMSFormat CAMS = new CAMSFormat(); try { // 并行执行四个数据获取方法,直接把返回值赋值给对应属性 Parallel.Invoke( () => CAMS.CAMSTrailPSI = bl.CAMSTrailPSIoutput(FromDate, ToDate, MemoType), () => CAMS.CAMSUpfrontPSI = bl.CAMSUpfrontPSIoutput(FromDate, ToDate, MemoType), () => CAMS.CAMSTrailSIPSTP = bl.CAMSTrailSIPSTPoutput(FromDate, ToDate, MemoType), () => CAMS.CAMSUpfrontSIPSTP = bl.CAMSUpfrontSIPSTPoutput(FromDate, ToDate, MemoType) ); } catch (AggregateException ex) { // 处理并行执行中可能出现的异常 foreach (var innerException in ex.InnerExceptions) { // 替换成你的日志记录或错误提示逻辑 Console.WriteLine($"数据获取失败: {innerException.Message}"); } // 根据业务需求决定是否终止后续Excel写入操作 return; } // 所有数据获取完成后,统一写入Excel的不同工作表 // 示例(根据你实际的Excel操作逻辑调整): WriteToExcelSheet(CAMS.CAMSTrailPSI, "TrailPSI"); WriteToExcelSheet(CAMS.CAMSUpfrontPSI, "UpfrontPSI"); WriteToExcelSheet(CAMS.CAMSTrailSIPSTP, "TrailSIPSTP"); WriteToExcelSheet(CAMS.CAMSUpfrontSIPSTP, "UpfrontSIPSTP");
关键注意事项
- 线程安全检查:确保你的
bl业务逻辑对象里的四个xxxoutput方法是线程安全的。比如,如果方法内部使用了共享的数据库连接或非线程安全资源,可能会引发问题。建议每个方法内部独立创建数据库连接,避免共享状态。 - 异常处理:只要有一个并行方法抛出异常,
Parallel.Invoke会把所有异常打包成AggregateException抛出,一定要用try-catch捕获,遍历InnerExceptions处理每个方法的具体异常。 - Excel写入规范:Excel操作(比如EPPlus、NPOI等库)通常不是线程安全的,必须等所有并行数据获取完成后,在主线程串行写入各个工作表,避免数据错乱或文件损坏。
- 性能权衡:并行执行能减少总耗时,但要考虑数据库负载——四个查询同时运行可能给数据库带来压力,如果数据库性能有限,可以用
ParallelOptions限制最大并发数,比如:var options = new ParallelOptions { MaxDegreeOfParallelism = 2 }; Parallel.Invoke(options, /* 委托列表 */);
内容的提问来源于stack exchange,提问作者Sini A
相关产品推荐
相关产品推荐

