none
C#中BackGroundWorker的详细使用方法以及如何正确高效访问父窗体UI控件方法 RRS feed

  • 问题

  •       我是在读的学生,最近自己筹划着写了个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()调用。
    2009年4月9日 3:16

答案

  • 在RunWorker中获取数据,在RunWorkComplate中绑定报表就好了
    知识改变命运,奋斗成就人生!
    • 已标记为答案 huating 2009年4月13日 7:11
    2009年4月9日 4:06
    版主

全部回复

  • 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(); }
    知识改变命运,奋斗成就人生!
    2009年4月9日 4:05
    版主
  • 在RunWorker中获取数据,在RunWorkComplate中绑定报表就好了
    知识改变命运,奋斗成就人生!
    • 已标记为答案 huating 2009年4月13日 7:11
    2009年4月9日 4:06
    版主
  • 你好!
         这一行似乎有问题,DoWorkCallBack dwc = new DoWorkCallBack(StartDoWork);
         怎么把这个函数本身指定给dwc了啊!
    周雪峰
    2009年4月9日 6:57
    版主
  • 这种委托是可以的, 我程序的其他部分就使用了,  经测试没出现过问题。
    华廷
    2009年4月9日 8:52
  • 补充:另外,不知怎么在DoWork事件处理函数中跟踪或获取水晶报表数据的载入进度以报告给ProgresChanged事件处理函数,请指教!
    华廷
    2009年4月9日 10:28