закрытие родительской формы вызывает дочернюю форму, в которой есть фоновый рабочий элемент

#c# #winforms #progress-bar #backgroundworker

#c# #winforms #индикатор выполнения #фоновый рабочий элемент

Вопрос:

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

Комментарии:

1. Получите индикатор выполнения и, если это выполнено на 100%, закройте его еще в событии закрытия формы, напишите необходимый код

Ответ №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();
    }
}   
  

Ответ №2:

Возможно, этот код работает.протестируйте это

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