如何将类内的进度报告给BackgroundWorker?

时间:2010-07-20 12:35:37

标签: c# backgroundworker

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

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

4 个答案:

答案 0 :(得分:14)

使用OnProgressChanged()BackgroundWorker方法报告进度并订阅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);
    }
}

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

答案 1 :(得分:8)

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

正如文章中所述:

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


更新

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

  • 工人阶级负责工作,因此它也有责任报告其进度。它产生后台线程来完成工作的事实不是表格的关注。

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

在你的班级打电话

 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

    }