2011-08-09 22 views
3

我有一个涉及两个窗体的Windows窗体应用程序。子窗体用于将数据导出到CSV文件,并使用后台工作人员来写入文件。在发生这种情况时,我隐藏了表单。 父表单在后台工作程序正在运行时仍处于活动状态,因此即使后台工作人员正在写入文件,用户也可以退出应用程序。在父窗体上我添加了一个FormClosing事件处理程序来提示用户后台工作人员是否仍在运行。 我遇到的问题是访问父窗体中的后台工作人员。以下是我试过......检查另一个窗体中的线程是否仍在运行

private void MainForm_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     ExportForm eForm = new ExportForm(GridView, TableName, GridProgressBar, ProgressLabel); 

     if (eForm.PartWorker.IsBusy == true) 
      MessageBox.Show("Busy"); 
    } 

的问题将是,它是创建子窗体的新实例,因此对于它的IsBusy属性后台工作人员将永远不会有真正的。我怎样才能以父母的形式访问这个后台工作人员,这样我就可以检查这个情况是否属实。

下面是PartWorker BackgroundWorker的代码...

#region PartWorker Events 

    void PartWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     GetSwitch(); 
     int batchNum = 0; 
     bool done = false; 
     ProgressLabel.Visible = true; 

     while (!done) 
     { 
      for (int i = 1; i <= 100; i++) 
      { 
       Thread.Sleep(100); 
       PartWorker.ReportProgress(i); 
      } 

      done = Export.ExportPartition(SaveFile, DataTable, 50000, batchNum++); 
     } 
    } 

    void PartWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     Progress.Style = ProgressBarStyle.Blocks; 
     Progress.Value = e.ProgressPercentage; 
     //May want to put the file name that is being written here. 
     ProgressLabel.Text = "Writing File: " + e.ProgressPercentage.ToString() +"% Complete"; 
    } 

    void PartWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     Progress.Value = 100; 
     ProgressLabel.Visible = false; 
     Progress.Visible = false; 
     MessageBox.Show("Files sucessfully created!", "Files Saved", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     PartWorker.Dispose(); 
     this.Close(); 
    } 
    #endregion 

回答

3

保持在主窗体的子窗体的引用:

class MainForm : Form { 
    private ExportForm exportForm; 

    // assign exportForm wherever the child form is created 
} 

接下来,在你的ExportForm,创建一个属性这表明表单仍然很忙。
这比访问其BackgroundWorker(阅读:封装)更好。

void MainForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (this.exportForm.IsBusy) 
     MessageBox.Show("Busy"); 
} 
+0

我已经实现了这一点,我可以看到它是如何工作的。但是,当我在MainForm_FormClosing事件中设置断点时,它会转到ExportForm中的PartWorker_ProgressChanged事件并遍历该事件处理程序。发生这种情况时,它永远不会执行MessageBox.Show(“Busy”)方法。 – Andrew

+0

我不太明白你在说什么。它何时进入'ProgressChanged'处理程序?如果你不设置断点,会发生什么? –

+0

是的,它进入改进处理程序。如果我没有设置断点,MessageBox永远不会显示,并且您不能退出应用程序。我将发布BackgroundWorker的事件处理程序的代码。我很确定问题出在那里。 – Andrew

0

创建一个单独的业务对象持有的后台工作,或背景的工人集合(如果你可以:

class ExportForm : Form { 
    public bool IsBusy { 
     get { return this.PartWorker.IsBusy; } 
    } 
} 

然后通过访问新建物业办主窗体的检查有多个)。从子窗体创建你的后台工作人员到这个单身人士,它将在应用程序域中的所有人都可以访问。

相关问题