我有一个涉及两个窗体的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
我已经实现了这一点,我可以看到它是如何工作的。但是,当我在MainForm_FormClosing事件中设置断点时,它会转到ExportForm中的PartWorker_ProgressChanged事件并遍历该事件处理程序。发生这种情况时,它永远不会执行MessageBox.Show(“Busy”)方法。 – Andrew
我不太明白你在说什么。它何时进入'ProgressChanged'处理程序?如果你不设置断点,会发生什么? –
是的,它进入改进处理程序。如果我没有设置断点,MessageBox永远不会显示,并且您不能退出应用程序。我将发布BackgroundWorker的事件处理程序的代码。我很确定问题出在那里。 – Andrew