C# 如何向后台工作人员报告类内的进度?

C# 如何向后台工作人员报告类内的进度?,c#,backgroundworker,C#,Backgroundworker,我的WinForm调用了一个类,该类执行一些复制操作。我想在表格上显示这方面的进展 我想使用Backgroundworker,但我不知道如何将进度从类报告到表单(/Backgroundworker)关于Backgroundworker的所有信息都已打开 正如文章中所说: 要接收进度更新通知,请处理ProgressChanged事件 更新: 在阅读了Martijn的补充问题之后,鉴于他有一个迄今为止一直在做他的工作的班级,大概是在前台线程上,我想补充以下内容: 工人阶级负责这项工作,因此也有责

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


我想使用Backgroundworker,但我不知道如何将进度从类报告到表单(/Backgroundworker)

关于Backgroundworker的所有信息都已打开

正如文章中所说:

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


更新:

在阅读了Martijn的补充问题之后,鉴于他有一个迄今为止一直在做他的工作的班级,大概是在前台线程上,我想补充以下内容:

  • 工人阶级负责这项工作,因此也有责任报告其进度。它产生一个后台线程来完成这项工作的事实与表单无关

  • 因此,我倾向于让类设置BGW,处理它的ProgressChanged事件,然后引发它自己的事件(在前台线程上),表单本身可以订阅这些事件。我使用这种技术编写了大量WinForms代码,效果很好

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

使用的方法报告进度,并订阅BackgroundWorker的以更新GUI中的进度

您的复制类了解
后台工作人员
,并订阅
ProgressChanged
。它还公开了一个自己的
ProgressChanged
事件,该事件由后台工作人员的
ProgressChanged
事件的事件处理程序引发。最后,您的
表单
订阅复制类的
ProgressChanged
事件并显示进度

代码:


在表单中,只需订阅
CopySomethingAsync
ProgressChanged
事件并显示进度。

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

MSDN在这里有一个小例子:

在您的类中调用

 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

    }

因此,我必须在我的类中添加一个公共背景属性,并且表单必须注册到progresschanged事件中?在这种情况下,我如何在我的类中公开progresschanged事件?我只会给您的类一个事件,该事件会在引发BackgroundWorker的progresschanged事件时引发。您的事件将具有与BackgroundWorker相同的签名。您从传递的
ProgressChangedEventArgs
ProgressPercentage
实例字段中获取传递给
ReportProgress
的值,即
progressBar1.value=e.ProgressPercentage
@Martijn您需要将BackgroundWorker引用设置到您的类才能调用Reportprogress方法您如何将ProgressChanged事件公开到表单中?这是一个非常好而且绝对有用的答案,非常感谢!我的表单如何订阅ProgressChanged事件?
backgroundWorker1.ProgressChanged+=new ProgressChangedEventHandler(backgroundWorker1\u ProgressChanged)
其中
backgroundWorker1\u ProgressChanged
是您的事件处理方法的名称,由代理
progresschangedventhandler
原型。我不明白,抱歉。我仍然不知道我的表单如何注册到
ProgressChanged
事件。在您的案例中,有一个方法(
backgroundWorker1\u ProgressChanged
)处理该事件。但是我的表单需要处理事件,而不是我的类..你所说的
我的类
是什么意思?表单通常由派生类表示。您不需要从
BackgroundWorker
派生自己的类。也许给我们看看代码?
//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

    }