c#BackgroundWorker DoWork方法调用另一个类和ProgressReport
我正在运行BackgroundWorker线程来完成一项耗时的任务。耗时的任务在另一个类中。我需要将在BackgroundWorker上运行的这个单独类的进度传递回主Form1类。我不知道如何处理这个问题。请提供建议。先谢谢你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
**// 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;
}