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