Если я попытаюсь щелкнуть правой кнопкой мыши закрыть приложение с минимизацией формы или с помощью вкладки приложений диспетчера задач, чтобы завершить процесс, событие FormClosing не запускается во время таймера определяется и работает/разрешено.Форма FormClosing event не срабатывает, если дизайнер создал таймер, был определен и запущен
//Extract from Form designer.cs:
....
private System.Windows.Forms.Timer timer1;
....
this.timer1 = new System.Windows.Forms.Timer(this.components);
this.timer1.Interval = 5000;
....
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
......
this.Load += new System.EventHandler(this.FormSI_Load);
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormSI_FormClosing);
//Extract from form.cs:
namespace namespace
{
public partial class FormSI : Form
{
.....
public FormSaturnInterface()
{
InitializeComponent();
......
timer1.Interval = intTimerIntervalms;
//timer1.Enabled = true; //FormClosing event not triggered if timer1 enabled
timer1.Enabled = false; //FormClosing event triggered if timer1 not enabled
........
private void FormSI_Load(object sender, EventArgs e)
{
MessageBox.Show("Load Event triggered["+ e.ToString() + "]", "Load Event triggered", MessageBoxButtons.OK); //Load event always triggered with or without timer1 enabled
}
private void FormSI_FormClosing(Object sender, FormClosingEventArgs e)
{
//e.Cancel = true; //stops app/form closing
timer1.Stop();
System.Text.StringBuilder messageBoxCS = new System.Text.StringBuilder();
messageBoxCS.AppendFormat("{0} = {1}", "CloseReason", e.CloseReason);
messageBoxCS.AppendLine();
messageBoxCS.AppendFormat("{0} = {1}", "Cancel", e.Cancel);
messageBoxCS.AppendLine();
MessageBox.Show(messageBoxCS.ToString(), "FormClosing Event");
}
........
Я не хочу, чтобы остановить/отключить таймер, пока попытка не будет сделано, чтобы закрыть/закрыть приложение пока еще хотите событие FormClosing для запуска. Каковы возможные решения этого сценария? Любая помощь будет высоко оценена.
Пожалуйста, обратите внимание, что FormSI.designer.cs уже содержит этот код:
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
MessageBox.Show("Disposing", "Disposing", MessageBoxButtons.OK);
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
Этот метод Dispose называется это событие Form_FormClosing когда timer1 отключен, но ни по-видимому, вызывается, когда timer1 и в этом случае конечная задача является единственным способом прекращения приложения/формы. Может быть, поток слишком занят, чтобы обработать запрос Close? Если да, то как можно заставить поток периодически прерываться, чтобы он мог обслуживать запрос на закрытие?
Проблема заключалась в том, что приложение не могло быть закрыто упорядоченным способом, позволяя пользователю запрашивать сохранение данных, например, или действительно ли это означает закрыть приложение. Проблема заключалась в том, что таймер был пойман в цикле, когда некоторые базы данных не были доступны, и поэтому никакие другие сообщения/события не могли быть обработаны одним потоком. Как только таймер вышел из цикла, либо тайм-аут или доступ к необходимой базе данных, все сообщения/события в очереди были обработаны правильно. Спасибо всем респондентам за время и обратную связь, это помогает мыслительным процессам и позволяет вам использовать альтернативные причины для определенного поведения. :)
Что нужно отключить таймер, когда все приложение срывается. Не похоже, что он будет продолжать работать, как только весь процесс перестанет существовать. – Servy