将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")的指针
在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)