
✅ 已完成带进度条的异步处理版本1. WinForm 界面新增控件在MainForm.Designer.cs中添加以下控件privateProgressBarprogressBar1;privateLabellblProgress;推荐布局progressBar1Dock Bottom或放置在按钮下方lblProgress显示文字进度如 “正在统计数据… 45%”2.完整异步 进度条代码MainForm.cs核心更新privateasyncvoidbtnGenerate_Click(objectsender,EventArgse){if(string.IsNullOrEmpty(txtInputFile.Text)||!File.Exists(txtInputFile.Text)){MessageBox.Show(请选择有效的输入 txt 文件,错误,MessageBoxButtons.OK,MessageBoxIcon.Error);return;}btnGenerate.Enabledfalse;progressBar1.Value0;lblProgress.Text准备处理...;progressBar1.Visibletrue;try{stringoutputPathPath.Combine(Path.GetDirectoryName(txtInputFile.Text),$Datalog_{txtJobNam.Text}_{txtLotId.Text}_{DateTime.Now:yyyyMMddHHmmssfff}.csv);varprogressnewProgressint(p{progressBar1.ValueMath.Min(p,100);lblProgress.Text$处理中...{p}%;});awaitGenerateCsvWithProgressAsync(outputPath,progress);progressBar1.Value100;lblProgress.Text处理完成;MessageBox.Show($生成成功\n{outputPath},成功,MessageBoxButtons.OK,MessageBoxIcon.Information);}catch(Exceptionex){MessageBox.Show($处理失败{ex.Message},错误,MessageBoxButtons.OK,MessageBoxIcon.Error);}finally{btnGenerate.Enabledtrue;// 可选延迟隐藏进度条awaitTask.Delay(800);progressBar1.Visiblefalse;}}异步主处理方法带进度privateasyncTaskGenerateCsvWithProgressAsync(stringoutputPath,IProgressintprogress){stringinputPathtxtInputFile.Text;progress?.Report(5);// 第一步异步统计varstatsawaitCalculateStatisticsWithProgressAsync(inputPath,progress);progress?.Report(35);constintBUFFER_SIZE128*1024;using(varfsnewFileStream(outputPath,FileMode.Create,FileAccess.Write,FileShare.None,BUFFER_SIZE,useAsync:true))using(varwriternewStreamWriter(fs,Encoding.UTF8,BUFFER_SIZE)){// 2. 复制前7行awaitCopyFirstNLinesAsync(inputPath,writer,7);progress?.Report(45);// 3. 写入 Header 参数区awaitWriteHeaderSectionAsync(writer,stats);progress?.Report(60);// 4. 写入 Bin SummaryawaitWriteBinSummaryAsync(writer,stats);progress?.Report(70);// 5. 复制数据区最耗时awaitCopyDataSectionWithProgressAsync(inputPath,writer,progress);awaitwriter.FlushAsync();progress?.Report(100);}}带进度的统计方法privateasyncTaskStatsCalculateStatisticsWithProgressAsync(stringfilePath,IProgressintprogress){vardutDictnewDictionarystring,bool(10000);longtotalLines0;longprocessed0;using(varfsnewFileStream(filePath,FileMode.Open,FileAccess.Read,FileShare.Read,65536,useAsync:true))using(varsrnewStreamReader(fs,Encoding.UTF8)){stringline;booldataStartedfalse;while((lineawaitsr.ReadLineAsync())!null){processed;if(processed%50000)// 每5000行更新一次进度{intpercent(int)(30*processed/Math.Max(totalLines,processed10000));// 预估progress?.Report(5percent);}if(line.StartsWith(STAT_NUM,StringComparison.OrdinalIgnoreCase)){dataStartedtrue;continue;}if(!dataStarted)continue;varcellsline.Split(new[]{,},StringSplitOptions.None);if(cells.Length9)continue;stringpartIdcells[2].Trim();stringresultcells[8].Trim().ToUpperInvariant();if(!dutDict.ContainsKey(partId))dutDict[partId]resultPASS;elseif(result!PASS)dutDict[partId]false;}}varstatsnewStats{TotaldutDict.Count,PassdutDict.Values.Count(vv),FaildutDict.Values.Count(v!v),FTTotaldutDict.Count,FTPassdutDict.Values.Count(vv),FTFaildutDict.Values.Count(v!v)};stats.Yieldstats.Total0?0:Math.Round(stats.Pass*100.0/stats.Total,2);returnstats;}带进度的复制数据区privateasyncTaskCopyDataSectionWithProgressAsync(stringinputPath,StreamWriterwriter,IProgressintprogress){using(varfsnewFileStream(inputPath,FileMode.Open,FileAccess.Read,FileShare.Read,65536,useAsync:true))using(varsrnewStreamReader(fs,Encoding.UTF8)){stringline;booldataStartedfalse;longlineCount0;while((lineawaitsr.ReadLineAsync())!null){lineCount;if(line.StartsWith(STAT_NUM,StringComparison.OrdinalIgnoreCase))dataStartedtrue;if(dataStarted)awaitwriter.WriteLineAsync(line);if(lineCount%100000){progress?.Report(70(int)(25*Math.Min(1.0,lineCount/500000.0)));// 动态进度}}}}使用建议在窗体设计器中添加ProgressBarName progressBar1LabelName lblProgress在MainForm构造函数中初始化progressBar1.Visiblefalse;progressBar1.StyleProgressBarStyle.Continuous;需要我现在给你完整的MainForm.cs单文件代码包含所有控件声明、事件、辅助类吗直接复制即可编译使用。