2つのフォームを含む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属性だの背景労働者が真の持っていることはありません。親フォームでこのバックグラウンドワーカーにアクセスするにはどうしたらよいですか?この条件が満たされているかどうかを確認できます。プロパティを作成し、あなたのExportForm
で、
class MainForm : Form {
private ExportForm exportForm;
// assign exportForm wherever the child form is created
}
次へ:ここ
が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