news 2026/5/7 13:02:01

多线程 + 进度条优化版(生产级)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
多线程 + 进度条优化版(生产级)

✅ 多线程 + 进度条优化版(生产级)

以下实现结合多线程精细进度控制,适合超大文件处理:

核心优化思路

  • 读取阶段:单线程顺序读取(文件I/O最安全高效)
  • 统计阶段:多线程并行处理数据行(Parallel.ForEach
  • 写入阶段:单线程顺序写入(保证顺序正确)
  • 进度反馈:使用IProgress<T>+SynchronizationContext安全更新 UI

完整代码实现

1. 进度报告类
publicclassProgressReport{publicintPercent{get;set;}publicstringStage{get;set;}publicstringDetail{get;set;}publicProgressReport(intpercent,stringstage,stringdetail=""){Percent=percent;Stage=stage;Detail=detail;}}
2.异步按钮事件
privateasyncvoidbtnGenerate_Click(objectsender,EventArgse){btnGenerate.Enabled=false;progressBar1.Visible=true;lblProgress.Text="启动处理...";try{stringoutputPath=Path.Combine(Path.GetDirectoryName(txtInputFile.Text),$"Datalog_{txtJobNam.Text}_{txtLotId.Text}_{DateTime.Now:yyyyMMddHHmmssfff}.csv");varprogress=newProgress<ProgressReport>(report=>{progressBar1.Value=Math.Min(report.Percent,100);lblProgress.Text=$"{report.Stage}{report.Percent}% -{report.Detail}";});awaitTask.Run(()=>GenerateCsvMultiThreaded(outputPath,progress));lblProgress.Text="✅ 处理完成!";MessageBox.Show($"生成成功!\n{outputPath}","成功");}catch(Exceptionex){MessageBox.Show($"错误:{ex.Message}","失败",MessageBoxButtons.OK,MessageBoxIcon.Error);}finally{btnGenerate.Enabled=true;}}
3.多线程主处理方法
privatevoidGenerateCsvMultiThreaded(stringoutputPath,IProgress<ProgressReport>progress){stringinputPath=txtInputFile.Text;progress?.Report(newProgressReport(0,"初始化"));// ==================== 第一阶段:多线程统计 ====================progress?.Report(newProgressReport(5,"多线程统计数据"));varstats=CalculateStatisticsMultiThread(inputPath,progress);progress?.Report(newProgressReport(45,"正在生成文件头"));// ==================== 第二阶段:写入文件 ====================using(varfs=newFileStream(outputPath,FileMode.Create,FileAccess.Write,FileShare.None,128*1024))using(varwriter=newStreamWriter(fs,Encoding.UTF8)){// 前7行CopyFirstNLines(inputPath,writer,7);progress?.Report(newProgressReport(52,"写入参数区"));WriteHeaderSection(writer,stats);progress?.Report(newProgressReport(58,"写入Bin汇总"));WriteBinSummary(writer,stats);progress?.Report(newProgressReport(65,"复制测试数据"));// 数据区复制(可考虑多线程分段写入,但需小心顺序)CopyDataSectionMultiThread(inputPath,writer,progress);}progress?.Report(newProgressReport(100,"完成"));}
4.多线程统计核心(关键优化)
privateStatsCalculateStatisticsMultiThread(stringfilePath,IProgress<ProgressReport>progress){varlines=newList<string>();booldataStarted=false;// 第一步:读取所有数据行(顺序)using(varsr=newStreamReader(filePath)){stringline;while((line=sr.ReadLine())!=null){if(line.StartsWith("STAT_NUM",StringComparison.OrdinalIgnoreCase)){dataStarted=true;continue;}if(dataStarted&&!string.IsNullOrWhiteSpace(line))lines.Add(line);}}progress?.Report(newProgressReport(15,"数据加载完成,开始并行计算"));vardutDict=newDictionary<string,bool>();varbinDict=newDictionary<(stringsoft,stringhard),BinInfo>();// ==================== 多线程并行处理 ====================objectlockObj=newobject();intprocessed=0;inttotalLines=lines.Count;Parallel.ForEach(lines,newParallelOptions{MaxDegreeOfParallelism=Environment.ProcessorCount},line=>{varcells=line.Split(new[]{','},StringSplitOptions.None);if(cells.Length<9)return;stringpartId=cells[2].Trim();stringsoftBin=cells[4].Trim();stringhardBin=cells[5].Trim();stringresult=cells[8].Trim().ToUpperInvariant();lock(lockObj){if(!dutDict.ContainsKey(partId))dutDict[partId]=result=="PASS";elseif(result!="PASS")dutDict[partId]=false;varkey=(softBin,hardBin);if(!binDict.ContainsKey(key))binDict[key]=newBinInfo{SoftBin=softBin,HardBin=hardBin};binDict[key].Count++;if(result!="PASS")binDict[key].IsPass=false;}// 进度更新Interlocked.Increment(refprocessed);if(processed%5000==0){intpercent=15+(int)(30*processed/(double)totalLines);progress?.Report(newProgressReport(percent,"并行统计中",$"{processed}/{totalLines}"));}});// 计算最终统计varstats=newStats{Total=dutDict.Count,Pass=dutDict.Values.Count(v=>v),Fail=dutDict.Values.Count(v=>!v),FTTotal=dutDict.Count,FTPass=dutDict.Values.Count(v=>v),FTFail=dutDict.Values.Count(v=>!v),BinList=binDict.Values.OrderBy(b=>b.SoftBin).ToList()};stats.Yield=stats.Total==0?0:Math.Round(stats.Pass*100.0/stats.Total,2);returnstats;}

5. 其他辅助方法(简略)

  • CopyFirstNLinesWriteHeaderSectionWriteBinSummaryCopyDataSectionMultiThread等可参考之前版本。

多线程优势

  • 统计阶段充分利用多核CPU
  • 大幅提升大数据文件处理速度
  • 进度反馈依然平滑准确
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 12:53:27

CUDA Agent:强化学习优化GPU内核性能

1. CUDA Agent技术解析&#xff1a;当强化学习遇上GPU内核优化 在深度学习计算领域&#xff0c;GPU内核的性能直接影响着模型训练和推理的效率。传统的内核优化方法主要依赖两种路径&#xff1a;一是基于人工经验的编译器优化&#xff08;如PyTorch的torch.compile&#xff09;…

作者头像 李华
网站建设 2026/5/7 12:52:30

BepInEx终极指南:5步轻松打造Unity游戏插件生态

BepInEx终极指南&#xff1a;5步轻松打造Unity游戏插件生态 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 想要为Unity游戏添加新功能却担心破坏原始代码&#xff1f;BepInEx插件…

作者头像 李华
网站建设 2026/5/7 12:49:38

ASMR资源管理新范式:asmroner如何重新定义音频内容获取体验

ASMR资源管理新范式&#xff1a;asmroner如何重新定义音频内容获取体验 【免费下载链接】asmr-downloader A tool for download asmr media from asmr.one(Thanks for the asmr.one) 项目地址: https://gitcode.com/gh_mirrors/as/asmr-downloader 你是否曾为寻找高质量…

作者头像 李华
网站建设 2026/5/7 12:48:28

3分钟掌握批量照片水印:自动添加相机参数和品牌Logo的终极指南

3分钟掌握批量照片水印&#xff1a;自动添加相机参数和品牌Logo的终极指南 【免费下载链接】semi-utils 一个批量添加相机机型和拍摄参数的工具&#xff0c;后续「可能」添加其他功能。 项目地址: https://gitcode.com/gh_mirrors/se/semi-utils 你是否厌倦了为每一张摄…

作者头像 李华