将BackgroundWorker传递给doWork调用的类?

时间:2012-04-03 07:03:53

标签: c# visual-studio backgroundworker

这可能吗?

我想要做的是让我的doWork方法实例化另一个类,然后调用它的start方法。然后我想将该类的进度报告回父类中的ProgressChanged处理程序。我已经尝试将引用传递给BackgroundWorker,但是我收到了一个错误。

private void ComplianceWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        ComplianceControlCenter CCC = 
         new ComplianceControlCenter(taskList.CheckedItems.OfType<string>().ToList(),
                                     file_box.Text, &ComplianceWorker);
        CCC.start();
    }

编辑:

只有一名背景工作者。我想通过引用ComplianceControlCenter的构造函数来传递它,以便我可以从该类内部向它发送进度更新。理由是班上做了一些相当复杂的工作,我需要进行划分。所以,我想将后台工作者从doWork方法传递给CCC对象,这样我就可以调用ComplianceWorker.ReportProgress();

  

错误1无法获取地址,获取大小或声明指向托管类型的指针('System.ComponentModel.BackgroundWorker')

6 个答案:

答案 0 :(得分:1)

在C#中,引用的传递方式如下:

ComplianceControlCenter CCC = new ComplianceControlCenter(..., ComplianceWorker);

不喜欢这个

ComplianceControlCenter CCC = new ComplianceControlCenter(..., &ComplianceWorker);

作为旁注,习惯上让变量和字段以小写字母开头,因此我将ComplianceWorker重命名为complianceWorker。请注意,这也改进了StackOverflow中的语法突出显示:; - )

ComplianceControlCenter ccc = new ComplianceControlCenter(..., complianceWorker);

答案 1 :(得分:0)

如果后台工作者都是相同的,那么你将进入无限循环。可能,创建两个不同的背景工作者。如果你需要一些类似的东西,请创建一个基类/接口。

答案 2 :(得分:0)

你可以这样做,虽然我没有看到它对简单案件的用途。由于您已经已经BackgroundWorker的业务方法中,因此通过创建另一个BackgroundWorker来使用更多线程毫无意义,并且您可以内联执行相同的工作。

如果您仍希望拥有第二个BackgroundWorker,则可以通过将处理程序附加到第二个工作程序的ProgressChanged事件,将进度更改事件从第二个工作程序传播到第一个工作程序。然后,此处理程序将在第一个worker上引发ProgressChanged事件,传播新闻。

例如:

private void ComplianceWorker_DoWork(object sender, DoWorkEventArgs e)
{
    var CCC = new ComplianceControlCenter(/* ... */);

    // Assume that CCC exposes a BackgroundWorker, but read below
    var worker = CCC.Worker; // "second" worker
    worker.ProgressChanged += this.PropagateProgressChanged;

    CCC.start();
}

private void PropagateProgressChanged(object sender, ProgressChangedEventArgs e)
{
    var worker = this.worker; // "first" worker
    worker.ReportProgress(e.ProgressPercentage, e.UserState);
}

此代码使用

将事件处理程序附加到“第二个”工作程序
var worker = CCC.Worker; // "second" worker
worker.ProgressChanged += this.PropagateProgressChanged;

假设ComplianceControlCenter直接公开了自己的BackgroundWorker。由于情况可能并非如此,您可以通过将this.PropagateProgressChanged的引用传递给构造函数来转换关系,并让它为您附加事件处理程序。

答案 3 :(得分:0)

为什么不将BackgroundWorker的引用作为参数传递给“工作”方法?

编辑:

实际上,如果您想要报告进度或检查CancellationPending标记,如果您还想手动取消操作,则必须这样做。

答案 4 :(得分:0)

如果您在BackgroundWorker活动中需要DoWork,只需简化sender。也许是这样的:

private void ComplianceWorker_DoWork(object sender, DoWorkEventArgs e)
{
    var worker = sender as BackgroundWorker;
    if(worker == null)
    {
        //ToDo: What should happen if MS changes the behavior??
    }

    ComplianceControlCenter CCC = new ComplianceControlCenter(taskList.CheckedItems.OfType<string>().ToList(), file_box.Text, worker);
    CCC.start();
}

答案 5 :(得分:0)

通过这样做来解决它..

ComplianceControlCenter CCC = new ComplianceControlCenter(taskList.CheckedItems.OfType<string>().ToList(), file_box.Text,ref complianceWorker);

以此为构造函数。

public ComplianceControlCenter(List<string> task_list, String exe_location, ref BackgroundWorker complianceWorker)