当前位置: 首页 > 编程语言 > C#

BackgroundWorker WPF与Progress Bar的困难分享

时间:2023-04-10 10:42:50 C#

C#学习教程:BackgroundWorkerWPF与进度条相关的困难这个过程需要很长时间,所以我想至少显示一个在接近完成时增长的进度条。现在,我在顶部有以下代码:privatereadonlyBackgroundWorkerworker=newBackgroundWorker();然后在循环中我有这个:worker.WorkerReportsProgress=true;worker.ReportProgress((100*i)/10000);我有一个私有子:privatevoidworker_ProgressChanged(objectsender,ProgressChangedEventArgse){prgBar.Value=Math.Min(e.ProgressPercentage,100);但我没有看到进度条更新或发生任何事情,程序仍然挂起。难道我做错了什么?更新:在此处尝试了MSDN指南http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx,但我不知道如何使用该示例。我当然调整了循环部分。嘿。它仍然闲置,没有任何更新。哎呀,我只想得到一个小计数器,每次读取和添加一行时它都会递增。更新的代码:privateBackgroundWorkerbw=newBackgroundWorker();publicProcess(){bw.WorkerReportsProgress=true;bw.WorkerSupportsCancellation=true;bw.DoWork+=newDoWorkEventHandler(bw_DoWork);bw.ProgressChanged+=newProgressChangedEventHandler(bw_ProgressChanged);bw.RunWorkerCompleted+=newRunWorkerCompletedEventHandler(bw_RunWorkerCompleted);}privatevoidbw_DoWork(objectsender,DoWorkEventArgse){BackgroundWorkerworker=senderasBackgroundWorker;//执行耗时操作并报告进度。诠释d=0;Microsoft.Win32.OpenFileDialogdlg=newMicrosoft.Win32.OpenFileDialog();//为文件扩展名和默认文件扩展名设置过滤器dlg.DefaultExt=".csv";dlg.Filter="CSV文件(*.csv)|*.csv";dlg.Title="文件";//通过调用ShowDialog方法显示OpenFileDialogNullableresult=dlg.ShowDialog();if(result==true){//打开文档stringfilename=dlg.FileName;列表文件内容=newList();你sing(FileStreamreader=File.OpenRead(@filename))//注意编码-UTF8分隔符=new[]{","};parser.HasFieldsEnclosedInQuotes=true;while(!parser.EndOfData){string[]line=parser.ReadFields();fileContent.Add(行);SqlCommandcomm=QUERYANDPARAMETERSd+=1;comm.ExecuteNonQuery();worker.ReportProgress((d*10));}}}}privatevoidbw_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse){lblCount.Content="Complete";}privatevoidbw_ProgressChanged(objectsender,ProgressChangedEventArgse){this.lblCount.Content=(e.ProgressPercentage.ToString()+"%");当工作人员运行时,我得到一个摘录“System.NullReferenceException”类型的异常发生在Solution.exe但未在用户代码中处理附加信息:未将对象引用设置为对象的实例。更新3完成!我只需要与上面相同的代码,但是:if(bw.IsBusy!=true){bw.RunWorkerAsync();}else{bw_DoWork(null,null);}在按下按钮的事件处理程序中。这不会按原样编译,但应该让您朝着正确的方向开始:privatereadonlyBackgroundWorkerworker=newBackgroundWorker{WorkerReportsProgress=true};publicMainWindow(){InitializeComponent();worker.DoWork+=worker_DoWork;worker.ProgressChanged+=worker_ProgressChanged;}privatevoidworker_DoWork(objectsender,DoWorkEventArgsdoWorkEventArgs){//做一些长的过程,把它分解成一个循环,这样你就可以定期调用worker.ReportProgress()worker.ReportProgress(i);//传回一些有意义的值}privatevoidworker_ProgressChanged(objectsender,ProgressChangedEventArgse){prgBar.Value=Math.Min(e.ProgressPercentage,100);}变量我整型?如果是,则(100*i)/10000将返回0并且i<100。并且ReportProgress方法的参数应该是一个百分比值。您可以将其更改为worker.ReportProgress(i);,尝试一下。以上就是C#学习教程的全部内容:BackgroundWorkerWPF和ProgressBar的难点。侵权请点击右侧联系管理员删除。如需转载请注明出处: