Mar*_*ijn 12 c# backgroundworker
我的WinForm调用一个执行一些复制操作的类.我想在表格上展示这方面的进展.
我想使用Backgroundworker,但我不知道如何报告从课程到表单的进度(/ backgroundworker)
and*_*dyp 14
使用BackgroundWorker的OnProgressChanged()方法报告进度并订阅BackgroundWorker 的ProgessChangedEvent以更新GUI中的进度.
您的副本类知道BackgroundWorker并订阅ProgressChanged.它还公开了ProgressChanged由事件处理程序为后台工作程序的事件引发的自己的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);
}
}
Run Code Online (Sandbox Code Playgroud)
在您的表单中,只需订阅ProgressChanged事件CopySomethingAsync并显示进度.
您需要了解的有关BackgroundWorker的所有信息都在msdn上.
正如文章中所说:
要接收进度更新通知,请处理ProgressChanged事件.
更新:
阅读了Martijn的补充问题,并考虑到他有一个迄今为止一直在做他的工作的课程,大概是在前台线程上,我会添加以下内容:
工人阶级负责工作,因此它也有责任报告其进展情况.它产生后台线程来完成工作这一事实并不是Form的关注点.
所以,我倾向于让类设置BGW,并处理它的ProgressChanged事件,然后提升它自己的事件(在前台线程上),然后表单本身可以订阅.我使用这种技术做了大量的WinForms编码,它工作正常.
另一种方法是将BGW作为工人类的公共属性公开,并使表单直接处理其事件.但是我不太喜欢这个,因为它使表单依赖于worker类的实现.这通常是一件坏事.