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