如果已定义并正在运行设计器创建的计时器,则表单FormClosing事件不会触发

时间:2014-01-08 11:08:31

标签: c# .net windows timer 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);
    }

当禁用timer1时,调用此Dispose方法以及Form_FormClosing事件,但在启用timer1时似乎都没有调用此方法,在这种情况下,end task是终止app / form的唯一方法。可能是线程太忙于处理关闭请求的时间了吗?如果是这样,怎么会导致线程被定期中断以允许它为关闭请求提供服务?

问题是,应用程序无法以有序的方式关闭,例如允许用户提示保存数据,或者他们是否真的意味着关闭应用程序。问题是当某些数据库不可用时,在循环中捕获定时器,因此单个线程不能处理其他消息/事件。一旦定时器退出循环,通过超时或到达所需的数据库,然后正确处理所有排队的消息/事件。感谢所有受访者的时间和反馈,这有助于思考过程,并让您了解某些行为的其他原因。 :)

1 个答案:

答案 0 :(得分:0)

问题是当某些数据库不可用时,循环中捕获的计时器,因此单个线程不能处理其他消息/事件。一旦定时器退出循环,通过超时或到达所需的数据库,然后正确处理所有排队的消息/事件。感谢所有受访者的时间和反馈,这有助于思考过程,并让您了解某些行为的其他原因。 :)