这可能吗?
我想要做的是让我的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')
答案 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)