2014-01-08 5 views
0

Если я попытаюсь щелкнуть правой кнопкой мыши закрыть приложение с минимизацией формы или с помощью вкладки приложений диспетчера задач, чтобы завершить процесс, событие 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? Если да, то как можно заставить поток периодически прерываться, чтобы он мог обслуживать запрос на закрытие?

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

+0

Что нужно отключить таймер, когда все приложение срывается. Не похоже, что он будет продолжать работать, как только весь процесс перестанет существовать. – Servy

ответ

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^