2011-08-09 22 views
3

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 

答えて

3

は、メインフォームで子フォームへの参照を保持しますフォームがまだビジー状態であることを示します。
これは、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; } 
    } 
} 

はその後、新しく作成されたプロパティにアクセスすることで、メインフォームでチェックを行います複数ある)。子フォームからこのシングルトンにバックグラウンドワーカーを作成すると、アプリドメイン内のすべてのユーザーがアクセスできます。

関連する問題