c#BackgroundWorker DoWork方法调用另一个类和ProgressReport

c#BackgroundWorker DoWork方法调用另一个类和ProgressReport,c#,backgroundworker,C#,Backgroundworker,我正在运行BackgroundWorker线程来完成一项耗时的任务。耗时的任务在另一个类中。我需要将在BackgroundWorker上运行的这个单独类的进度传递回主Form1类。我不知道如何处理这个问题。请提供建议。先谢谢你 **// Main Form1 UI Class** public void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e) { //e.Argumen

我正在运行BackgroundWorker线程来完成一项耗时的任务。耗时的任务在另一个类中。我需要将在BackgroundWorker上运行的这个单独类的进度传递回主Form1类。我不知道如何处理这个问题。请提供建议。先谢谢你

    **// Main Form1 UI Class**    

    public void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
    {
        //e.Argument always contains whatever was sent to the background worker
        // in RunWorkerAsync. We can simply cast it to its original type.
        DataSet ds = e.Argument as DataSet;
        this.createje.ProcessData(this.ds);
    }

    private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        this.progressBar1.Minimum = 0;
        this.progressBar1.Maximum = CreateJE.max;
        this.progressBar1.Value = e.Recno;
    }

    **//Other Class called CreateJE**

    public void ProcessData(DataSet ds)
    {
        //Do time consuming task...
     for (int i = 1; i <= 10; i++)
        {
            if (worker.CancellationPending == true)
            {
                e.Cancel = true;
                break;
            }
            else
            {
                // Perform a time consuming operation and report progress.
                System.Threading.Thread.Sleep(500);

                **//How do I report progress back to the Main UI?** 
                //worker.ReportProgress(i * 10);
            }
        }
    }
**//主窗体1 UI类**
public void backgroundWorker2_DoWork(对象发送方,DoWorkEventArgs e)
{
//e、 参数始终包含发送给后台工作程序的内容
//在RunWorkerAsync中,我们可以简单地将其转换为原始类型。
数据集ds=e。参数作为数据集;
this.createje.ProcessData(this.ds);
}
private void backgroundWorker2\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
此值为1.1。最小值=0;
this.progressBar1.max=CreateJE.max;
this.progressBar1.Value=e.Recno;
}
**//另一个名为CreateJE的类**
公共void ProcessData(数据集ds)
{
//做耗时的任务。。。

对于(int i=1;i最干净、最可扩展的解决方案,可能是让您的
ProcessData()
方法引发一个事件,
BackgroundWorker
正在侦听该事件。这样
ProcessData()
就不依赖于调用
BackgroundWorker
。(您还需要采取一种方法取消
ProcessData()
)。如果需要,您甚至可以重新使用
ProgressChangedEventArgs
。例如(未经测试,但您知道了吗?)

部分类Form1{
public void backgroundWorker2_DoWork(对象发送方,DoWorkEventArgs e){
//e、 参数始终包含发送给后台工作程序的内容
//在RunWorkerAsync中,我们可以简单地将其转换为原始类型。
数据集ds=(数据集)e.参数;
var bgw=(BackgroundWorker)发送方;
var eh=新的进度变更管理器((o,a)=>bgw.ReportProgress(a.ProgressPercentage));
createje.ProgressChanged+=eh;
this.createje.ProcessData(this.ds));
createje.ProgressChanged-=eh;//需要停止侦听
}
private void backgroundWorker2\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
此值为1.1。最小值=0;
this.progressBar1.max=CreateJE.max;
this.progressBar1.Value=e.ProgressPercentage;
}
}
部分类CreateJE{
公共事件进度变更管理者进度变更;
ProgressChanged(ProgressChangedEventArgs e)上受保护的虚拟无效
{ 
var-hand=ProgressChanged;
如果(hand!=null)hand(this,e);
}
公共void ProcessData(数据集ds)
{

对于(int i=1;i而言,最快和最简单的选择是在类
CreateJE
中声明一个
委托
,该委托将报告进度,然后将其挂接到
BackgroundWorker
报告进度
方法

class CreateJE
{
    public Action<int> ReportProgressDelegate{get;set;}

    public void ProcessData(DataSet ds)
    {
        for(int i = 0; i < 10; i++)
        {
            Thread.Sleep(500);
            ReportProgress(i*10);
        }
    }

    private void ReportProgress(int percent)
    {
        if(ReportProgressDelegate != null)
            ReportProgressDelegate(percent);
    }
}
之后,您可以使用已有的事件处理程序(
backgroundWorker2\u-DoWork
backgroundWorker2\u-DoWork


PS:您应该使用与
worker.CancellationPending
属性相同的方法。

我喜欢您的第一个建议。您能提供一个代码示例吗?
class CreateJE
{
    public Action<int> ReportProgressDelegate{get;set;}

    public void ProcessData(DataSet ds)
    {
        for(int i = 0; i < 10; i++)
        {
            Thread.Sleep(500);
            ReportProgress(i*10);
        }
    }

    private void ReportProgress(int percent)
    {
        if(ReportProgressDelegate != null)
            ReportProgressDelegate(percent);
    }
}
protected override void OnLoad(EventArgs e)
{
    this.creatje.ReportProgressDelegate = worker.ReportProgress;
}