检查另一种形式的线程是否仍在运行

时间:2011-08-09 18:43:58

标签: c# winforms visual-studio-2010 backgroundworker

我有一个涉及两个表单的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

2 个答案:

答案 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)

创建一个单独的业务对象,该对象包含后台工作程序或后台工作程序的集合(如果您可能有多个)。将子表单中的后台工作程序创建为此单例,并且应用程序域中的所有人都可以访问它。