如何报告从一个类到BackgroundWorker的进度?

我的WinForm调用一个执行一些复制操作的类。 我想在表格上展示这方面的进展。

我想使用Backgroundworker,但我不知道如何报告从课程到表单的进度(/ backgroundworker)

使用BackgroundWorker的OnProgressChanged()方法报告进度并订阅BackgroundWorker的ProgessChangedEvent以更新GUI中的进度。

您的副本类知道BackgroundWorker并订阅ProgressChanged 。 它还公开了一个自己的ProgressChanged事件,该事件由后台worker的ProgressChanged事件的事件处理程序引发。 最后,您的Form订阅了复制类的ProgressChanged事件并显示了进度。

码:

 public class CopySomethingAsync { private BackgroundWorker _BackgroundWorker; public event ProgressChangedEventHandler ProgressChanged; public CopySomethingAsync() { // [...] create background worker, subscribe DoWork and RunWorkerCompleted _BackgroundWorker.ProgressChanged += HandleProgressChanged; } private void HandleProgressChanged(object sender, ProgressChangedEventArgs e) { if (ProgressChanged != null) ProgressChanged.Invoke(this, e); } } 

在您的表单中,只需订阅CopySomethingAsyncProgressChanged事件并显示进度。

您需要了解的有关BackgroundWorker的所有信息都在msdn上 。

正如文章中所说:

要接收进度更新通知,请处理ProgressChanged事件。


更新:

阅读了Martijn的补充问题,并考虑到他有一个迄今为止一直在做他的工作的课程,大概是在前台线程上,我会添加以下内容:

  • 工人阶级负责工作,因此它也有责任报告其进展情况。 它产生后台线程来完成工作这一事实并不是Form的关注点。

  • 所以,我倾向于让类设置BGW,并处理它的ProgressChanged事件,然后提升它自己的事件(在前台线程上),然后表单本身可以订阅。 我使用这种技术做了很多WinForms编码,它工作正常。

另一种方法是将BGW作为工人类的公共属性公开,并让表单直接处理其事件。 但是我不太喜欢这个,因为它使表单依赖于worker类的实现。 这通常是一件坏事。

它是通过当前BackgroundWorker对象的ReportProgress实例方法完成的。 您的表单必须订阅ProgressChanged事件。

MSDN在这里有一个小例子: http : //msdn.microsoft.com/en-us/library/waw3xexc%28v=VS.100%29.aspx

打电话给你的class级

  backgroundWorker.ReportProgress(i++); 

在表单处理程序上的事件

 //declare progressBar1 in the form and set range // progressBar1.Minimum = 0; //progressBar1.Maximum = 100; private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { //show progress bar }