C#后台工作者更新状态标签这应该是一件相当简单的事情;但是,我一直无法弄清楚。///此部分位于InitializeComponent()方法中///窗体的类,即部分类frmMain{....}this.bgw=newSystem.ComponentModel.BackgroundWorker();this.bgw.WorkerReportsProgress=true;this.bgw.DoWork+=newSystem.ComponentModel.DoWorkEventHandler(this.bgw_DoWork);this.bgw.ProgressChanged+=newSystem.ComponentModel.ProgressChangedEventHandler(this.bgw_ProgressChanged);///这段代码位于publicpartialclassfrmMain:Form{....}privatevoidbgw_DoWork(objectsender,DoWorkEventArgse){for(inti=1;i<=100;i++){Thread.Sleep(100);//等待100毫秒//Console.WriteLine(i);bgw.ReportProgress(i);}}privatevoidbgw_ProgressChanged(objectsender,ProgressChangedEventArgse){//更新状态标签lblStatus.Text=e.ProgressPercentage.ToString();}//编辑后添加到问题的新代码publicfrmMain(){InitializeComponent();bgw.RunWorkerAsync();//somemorestuff...}后台作业者正常运行;但是,如果我取消注释DoWork事件中的注释行,它不会正确更新其进度,我能够正确地看到状态更新;但是,直到主线程中的任务(繁重的数据库计算内容)完成ProgressChanged事件后,它才会触发。这是使用.NETFramework4的Windows窗体应用程序。编辑请参阅上面代码中的注释以了解代码所在的位置。更多详细信息正在执行的代码涉及对数据库执行多个查询。我无权披露该代码。至于代码是如何执行的,我实际上并不知道,因为另一个开发人员将.dll交给了我,并告诉我只在访问数据库时使用它......编辑“更多内容”部分中的代码已移动如下privatevoidfrmMain_Load(objectsender,EventArgse){//一些更多的东西……也就是运行查询!您的BackgroundWorker代码很好。问题是您在其他地方(在这种情况下,在您的构造函数或FormLoad中)有代码阻塞了UI线程(通过执行同步数据库请求)。您需要做一些事情来确保此代码在非UI线程中运行。这可能意味着使用现有的BackgroundWorker来执行其他长时间运行的任务;它也可以通过使用Task.Factory.StartNew或其他一些线程机制来完成,让它在非UI线程中运行。一旦UI线程被解锁,您将看到`ProgressChanged事件处理程序中的更新反映在UI中。@Servy当然是正确的。我只是想用这段代码来重现问题:以上是C#学习教程的全部内容:C#backgroundworkerupdatesthestatuslabelsharing。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——publicpartialclassForm1:Form{publicForm1(){InitializeComponent();bgw.RunWorkerAsync();Task.Factory.StartNew(SomeMoreStuff);}privatevoidSomeMoreStuff(){for(inti=0;i本文来自网络合集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载,请注明出处:
