Есть ли лучший способ для решения задачи сделать что-то после того, как пользователь выбрал выход из программы WinForms, чем этот:
[править 1: в ответ на комментарий 'NoBugz ] В этом случае в форме нет ControlBox , и есть причина для включения одного уровня косвенности в что происходит, когда пользователь решает закрыть форму [/ edit 1]
[править 2: в ответ на все комментарии по Гринвичу +7 18:35 января 20 ] Возможно, использование затухания MainForm - простая иллюстрация того, что вы можете захотеть делать так, как приложение закрывается: пользователь не может с этим взаимодействовать: это, очевидно, связано с решением пользователя закрыть приложение. [/ edit 2]
(использовать какую-либо форму многопоточности?) (Значение для многопоточного приложения?) (Этот код "плохо пахнет"?)
// 'shutDown is an external form-scoped boolean variable
//
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// make sure we don't block Windows ShutDown
// or other valid reasons to close the Form
if (e.CloseReason != CloseReason.ApplicationExitCall) return;
// test for 'shutDown flag set here
if (shutDown) return;
// cancel closing the Form this time through
e.Cancel = true;
// user choice : default = 'Cancel
if (MessageBox.Show("Exit Application ?", "", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == System.Windows.Forms.DialogResult.OK)
{
// user says Exit : activate Timer, set the flag to detect Exit
timer1.Enabled = true;
shutDown = true;
}
}
Резюме: в очень стандартном приложении WinForms (одна MainForm, запущенная в Program.cs стандартным способом): в обработчике события FormClosing MainForm:
немедленно завершить работу (вызывая поведение по умолчанию: закрытие MainForm и выход из приложения), если:
а. CloseReason - это что-то другое CloseReason.ApplicationExitCall
б. если для специальной логической переменной задано значение true или
если нет немедленного выхода: отмените «первый звонок» в FormClosing.
пользователь затем делает выбор, через диалоговое окно MessageBox.Show, выйти из приложения или отменить:
а. если пользователь отменяет, конечно, приложение остается «как есть».
б. если пользователь выбрал «Выход»:
установить для переменной специального логического флага значение true
запустить таймер, который делает что-то особенное.
когда внутренний тест в коде таймера обнаруживает, что «особые вещи» выполнены, он вызывает Application.Exit