我有一个涉及两个表单的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");
}
问题是它正在创建一个Child Form的新实例,因此后台worker永远不会为它的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
答案 0 :(得分:3)
在主窗体中保留对子窗体的引用:
class MainForm : Form {
private ExportForm exportForm;
// assign exportForm wherever the child form is created
}
接下来,在您的ExportForm
中,创建一个表明表单仍然忙碌的属性
这是一种比访问BackgroundWorker
更好的方法(读取:封装)。
class ExportForm : Form {
public bool IsBusy {
get { return this.PartWorker.IsBusy; }
}
}
然后通过访问新创建的属性来检查主表单:
void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (this.exportForm.IsBusy)
MessageBox.Show("Busy");
}
答案 1 :(得分:0)
创建一个单独的业务对象,该对象包含后台工作程序或后台工作程序的集合(如果您可能有多个)。将子表单中的后台工作程序创建为此单例,并且应用程序域中的所有人都可以访问它。