积极答复者
C#中BackGroundWorker的详细使用方法以及如何正确高效访问父窗体UI控件方法

问题
-
我是在读的学生,最近自己筹划着写了个winform小程序,在编写一个和BackGroundWorker使用有关的代码段时出现了问题。我程序设计的总体思路是:在一个子窗体载入事件Page_Load中调用backGroundWorker1.RunAysnc()启动BackGroundWorker,之后及启动的代码如下:
private void FrmPrintBalance_Load(object sender, EventArgs e)
{
Cursor.Current = System.Windows.Forms.Cursors.AppStarting;
FrmMain parentFrm = (FrmMain)this.MdiParent;
parentFrm.timer1.Stop();
parentFrm.toolstateDate.Text = "收支汇总报表正在载入中...";
parentFrm.toolStripProgressBar2.Visible = true;
if (!backgroundWorker1.IsBusy)
{
backgroundWorker1.RunWorkerAsync(); //启动BackGroundWorker
}
}
private delegate void DoWorkCallBack();
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
Thread myTread = new Thread(new ThreadStart(StartDoWork));
myTread.Start();
}
private void StartDoWork() //若要操作UI,只有DoWork中需要借助Invoke,其他两个不用
{
if (this.InvokeRequired)
{
DoWorkCallBack dwc = new DoWorkCallBack(StartDoWork);
this.Invoke(dwc);
}
else
{
this.tb_FamilyBalanceTableAdapter1.Fill(this.financialMISDataSet_tb_FamilyBalance1.tb_FamilyBalance);
CrystalReportFamilyBalance1.SetDataSource(this.financialMISDataSet_tb_FamilyBalance1); //给水晶报表填充数据
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
FrmMain parentForm = (FrmMain)this.MdiParent;
parentForm.toolStripProgressBar2.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
FrmMain parentForm = (FrmMain)this.MdiParent;
parentForm.toolstateDate.Text = "收支汇总报表载入完成";
parentForm.toolStripProgressBar2.Visible = false;
parentForm.timer1.Start();
}
可是不知什么原因,调试时总是在“this.Invoke(dwc)"处报“未将对像实例化”,另外觉得好像缺个启动backgroundWorker1_ProgressChanged()的ReportProgress()调用。- 已移动 Sheng Jiang 蒋晟Moderator 2009年4月9日 14:23 Windows表单类库问题
答案
全部回复
-
private void FrmPrintBalance_Load(object sender, EventArgs e) { Cursor.Current = System.Windows.Forms.Cursors.AppStarting; FrmMain parentFrm = (FrmMain)this.MdiParent; parentFrm.timer1.Stop(); parentFrm.toolstateDate.Text = "收支汇总报表正在载入中..."; parentFrm.toolStripProgressBar2.Visible = true; if (!backgroundWorker1.IsBusy) { backgroundWorker1.RunWorkerAsync(); //启动BackGroundWorker } } private delegate void DoWorkCallBack(); private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { StartDoWork(); } private void StartDoWork() //若要操作UI,只有DoWork中需要借助Invoke,其他两个不用 { this.tb_FamilyBalanceTableAdapter1.Fill(this.financialMISDataSet_tb_FamilyBalance1.tb_FamilyBalance); } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { FrmMain parentForm = (FrmMain)this.MdiParent; parentForm.toolStripProgressBar2.Value = e.ProgressPercentage; } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { CrystalReportFamilyBalance1.SetDataSource(this.financialMISDataSet_tb_FamilyBalance1); //给水晶报表填充数据 FrmMain parentForm = (FrmMain)this.MdiParent; parentForm.toolstateDate.Text = "收支汇总报表载入完成"; parentForm.toolStripProgressBar2.Visible = false; parentForm.timer1.Start(); }
知识改变命运,奋斗成就人生!