将BackgroundWorker传递到doWork调用的类

本文关键字:调用 doWork BackgroundWorker | 更新日期: 2023-09-27 18:29:45

这可能吗?

我想做的是让我的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")的指针

将BackgroundWorker传递到doWork调用的类

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

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

不像这个

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

顺便说一句,通常让变量和字段以小写字母开头,所以我将ComplianceWorker重命名为complianceWorker。请注意,这还改进了StackOverflow中的语法高亮显示:;-)

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

你可以这样做,尽管我不知道它对简单的情况有什么作用。由于已经在BackgroundWorker的业务方法中,因此通过创建另一个BackgroundWorker来使用更多线程是没有意义的,您可以在内联中完成同样的工作。

如果您仍然想要第二个BackgroundWorker,可以通过将处理程序附加到第二个工作程序的ProgressChanged事件,将进度更改的事件从第二个工作者传播到第一个工作者。然后,该处理程序将在第一个工作者上引发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;

假设CCD_ 9直接暴露其自身的CCD_。由于情况可能并非如此,因此可以通过将对this.PropagateProgressChanged的引用传递给构造函数并让它为您附加事件处理程序来扭转关系。

如果两个后台工作程序相同,则将运行到一个无限循环。可能会创建两个不同的后台工作人员。如果您需要它们之间类似的东西,请创建一个基类/接口。

如果在DoWork事件中需要BackgroundWorker本身,只需向上投射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();
}

为什么不将BackgroundWorker的引用作为参数传递给"work"方法?

编辑:

事实上,如果您想报告进度,或者如果您还想手动取消操作,则必须检查CancellationPending标志。

通过这样做解决了它。。

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

以this作为构造函数。

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