C# 如何向后台工作人员报告类内的进度?
我的WinForm调用了一个类,该类执行一些复制操作。我想在表格上显示这方面的进展C# 如何向后台工作人员报告类内的进度?,c#,backgroundworker,C#,Backgroundworker,我的WinForm调用了一个类,该类执行一些复制操作。我想在表格上显示这方面的进展 我想使用Backgroundworker,但我不知道如何将进度从类报告到表单(/Backgroundworker)关于Backgroundworker的所有信息都已打开 正如文章中所说: 要接收进度更新通知,请处理ProgressChanged事件 更新: 在阅读了Martijn的补充问题之后,鉴于他有一个迄今为止一直在做他的工作的班级,大概是在前台线程上,我想补充以下内容: 工人阶级负责这项工作,因此也有责
我想使用Backgroundworker,但我不知道如何将进度从类报告到表单(/Backgroundworker)关于Backgroundworker的所有信息都已打开 正如文章中所说: 要接收进度更新通知,请处理ProgressChanged事件
更新: 在阅读了Martijn的补充问题之后,鉴于他有一个迄今为止一直在做他的工作的班级,大概是在前台线程上,我想补充以下内容:
- 工人阶级负责这项工作,因此也有责任报告其进度。它产生一个后台线程来完成这项工作的事实与表单无关
- 因此,我倾向于让类设置BGW,处理它的ProgressChanged事件,然后引发它自己的事件(在前台线程上),表单本身可以订阅这些事件。我使用这种技术编写了大量WinForms代码,效果很好
后台工作人员
,并订阅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
}