Событие 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 ответ

Проблема заключалась в том, что таймер перехватывался в цикле, когда определенные базы данных были недоступны, и поэтому никакие другие сообщения / события не могли быть обработаны одним потоком. Как только таймер вышел из цикла, либо по таймауту, либо по достижению требуемой базы данных все сообщения / события в очереди были обработаны правильно. Спасибо всем респондентам за время и обратную связь, это помогает мыслительным процессам и позволяет вам найти альтернативные причины для определенного поведения.:)

Другие вопросы по тегам