报告异步任务进度各位开发者,我面临着一个小小的困境。我有一个WPF应用程序,它读取一个相当大的Excel文件并将其输出为一个XML文件。我面临的问题是我想向处理程序报告操作进度。我无法让它“顺利”地工作,从字面上看,GUI线程中的进度条会立即被填充,然后保存从Excel文件读取的内容的DataGrid会立即被填充。我是Async/Await/Task的新手,我一直在使用BackgroundWorker,但我希望获得更多这方面的知识,如果这是一个愚蠢的问题,我深表歉意。我从这里阅读了StephenCleary的教程。老实说,我不知道为什么进度条没有像它应该的那样“顺利”填充......在GUI中调用的代码:varprogress=newProgress(progressPercent=>pBar.Value=progressPercent);Task.Run(()=>_sourceService.ReadFileContent(filePath,progress)).ContinueWith(task=>{dataGrid.ItemsSource=task.Result.DefaultView;DataTable=task.Result;如果(DataTable.Rows.Count>0)BtnCreateXmlFile.IsEnabled=true;},CancellationToken.None,TaskContinuationOptions.None,TaskScheduler.FromCurrentSynchronizationContext());ReadFileContent(filePath,progress)方法体ReadFileContent(filePath,progress):publicDataTableReadFileContent(stringfilePath,IProgressprogress){covarrowStart=7varStart;=1;varexistingFile=newFileInfo(文件路径);使用(varpackage=newExcelPackage(existingFile)){varworksheet=package.Workbook.Worksheets["BOP"];vardt=newDataTable();//表格名称由://-产品类型//-客户//-客户项目//*这些可以可在ExcelFile中的“CollaborationContext”工作表中找到。如果(package.Workbook.Worksheets["CollaborationContext"].SelectedRange["B6"].Value.Equals("object_type")){dt.TableName=package.Workbook.Worksheets["CollaborationContext"].SelectedRange["C9"].Value+""+package.Workbook.Worksheets["CollaborationContext"].SelectedRange["D9"].Value+""+package.Workbook.Worksheets["CollaborationContext"].SelectedRange["E9"].Value;}dt.TableName=package.Workbook.Worksheets["CollaborationContext"].SelectedRange["B9"].Value+""+package.Workbook.Worksheets["CollaborationContext"].SelectedRange["C9"].Value+""+package.Workbook.Worksheets["CollaborationContext"].SelectedRange["D9"].Value;//只报告块。我们不想为读取的每一行调用`progress.Report`。vartotalRows=worksheet.Dimension.End.Row;varcurrentIndex=0;varpercentageProgress=totalRows/10;//获取列并将它们添加到DataTablefor(varcol=columnStart;col<=worksheet.Dimension.End.Column-1;col++)dt.Columns.Add(worksheet.Cells[6,col].Value.ToString());//将数据放入DataTablefor(varrow=rowStart;row<=worksheet.Dimension.End.Row;row++){vardr=dt.NewRow();变量x=0;当前索引++;对于(varcol=columnStart;col<=worksheet.Dimension.End.Column-1;col++){dr[x++]=worksheet.Cells[row,col].Value;}dt.Rows.Add(博士);//向处理程序报告进度if(currentIndex%percentageProgress==0)progress?.Report(row);}返回dt;}}先谢谢您!首先,让我们摆脱危险的ContinueWith调整你真的应该使用等待:varprogress=newProgress(progressPercent=>pBar.Value=progressPercent);varresult=awaitTask.Run(()=>_sourceService.ReadFileContent(filePath,progress));dataGrid.ItemsSource=结果.DefaultView;数据表=结果;如果(DataTable.Rows.Count>0)BtnCreateXmlFile.IsEnabled=true;接下来,您可能会看到有关进度的问题是您的Progress处理程序期望progressPercent,但ReadFileContent将其发送以读取行,而不是百分比。所以,要解决这个问题:if(currentIndex%percentageProgress==0)progress?.Report(row*100/totalRows);(这里还有其他几个选项;例如,如果您想要更高级的UI,您可以决定报告当前行和总行数)。进度条没有像它应该的那样“顺利”填充我上面描述的是最低可接受的解决方案。特别是“updateonly10times”的代码有点问题;它总是更新10次,无论更新多快或多慢。更通用的解决方案是使用基于Rx的IProgress解决方案,它允许您根据时间进行限制(例如每秒4次更新)。以上就是C#学习教程:报告AsyncTask的进度的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
