【发布时间】:2011-08-09 18:43:58
【问题描述】:
我有一个涉及两个窗体的 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
【问题讨论】:
标签: c# winforms visual-studio-2010 backgroundworker