закрытие родительской формы вызывает дочернюю форму с фоновым рабочим - PullRequest
1 голос
/ 17 мая 2011

Я пытаюсь добиться этого: У меня есть основная форма, когда пользователь нажимает на красный крестик в правом верхнем углу, чтобы выйти из приложения, появляется всплывающая форма, показывающая, что приложение обновляет / сохраняет информацию. После того, как фоновый работник в форме индикатора выполнения закрывается, он закрывает форму индикатора выполнения и также закрывает основную форму. проблема у меня заключается в том, что он сначала закрывает основной, даже не работая в фоновом режиме. как это исправить? я попытался использовать 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 ]

1 голос
/ 17 мая 2011

Настройка 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();
    }
}   
0 голосов
/ 17 мая 2011
0 голосов
/ 17 мая 2011

Может быть, этот код работает. Проверьте это

 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()
}
}
...