父窗体关闭调用子窗体,其中包含后台工作器

时间:2011-05-17 08:15:28

标签: c# winforms progress-bar backgroundworker

我试图实现这个目标: 我有主窗体,当用户单击右上角的红叉以退出应用程序时,会弹出一个进度条表单,指示应用程序正在更新/保存信息。进度条表单中的后台工作程序完成后,它将关闭进度条表单并关闭主表单。 我遇到的问题是,它甚至没有运行后台工作程序就从第一个关闭了main。怎么解决这个问题?我试图使用e.cancel = true它只是给了我的死循环。

这是我的主要形式:

 private static void mainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
 UpdatingForm pbar = new UpdatingForm ();


            pbar.Show();
}

在我的更新表格中:

public UpdatingForm()
        {
            InitializeComponent();

            bgWorker.RunWorkerAsync();
        }

    private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
            {
    ....
    }

private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {

            this.Close();
            // Application.Exit();
        }

3 个答案:

答案 0 :(得分:1)

e.Cancel设置为true是正确的。但是,一旦您UpdatingForm关闭,Application.Exit()再次触发mainForm_FormClosing()事件,您就会再获得一个UpdatingForm等。

private static bool isClosing = false;
private static void mainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (!isClosing)
    {
        isClosing = true;
        e.Cancel = true;
        UpdatingForm pbar = new UpdatingForm ();
        pbar.Show();
    }
}   

答案 1 :(得分:0)

也许这段代码有效。测试

 private static void mainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
 UpdatingForm pbar = new UpdatingForm ();


            pbar.Show();
while (pbar.Created)
{
Application.DoEvents()
}
}

 private static void mainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
 UpdatingForm pbar = new UpdatingForm ();


            pbar.Show();
while (! pbar.IsDisposed)
{
Application.DoEvents()
}
}

答案 2 :(得分:0)