アプリケーション終了時のイベントハンドラを定義する

多くの初心者むけ参考書ではアプリケーション終了時のイベントは FormClosing() を使いましょうと書いてあります。それはそれでいいのですが、フォームが閉じる途中に発生するイベントなので使い勝手が悪い場合もあります。

特にスレッドなどを扱っている場合は問題が発生しやすいです。

フォームが閉じられた後に発生する FormClosed() というのもあるのですが、フォームが閉じられて、その後にアプリケーションが終了するときに発生するイベントはないのでしょうか?

もちろんあります。独自にイベントハンドラを定義しないといけないのですが、とても簡単なのでご紹介します。

15行目でアプリケーション終了時に発生するイベントハンドラを設定します。具体的に実施したいコードは自分で記述します。それが37~40行目にあたります。

using System;
using System.Windows.Forms;

namespace aaa
{
	public partial class Form1 : Form
	{

		public Form1()
		{

			InitializeComponent();

			// フォームが閉じられた後のアプリケーション終了時のイベントハンドラを設定する.
			Application.ApplicationExit += this.MyEventHandler_ApplicationExit;

			MessageBox.Show( "Form Constructor();" );

		}

		private void Form1_Load( object sender, EventArgs e )
		{
			MessageBox.Show( "Load();" );
		}

		private void Form1_FormClosing( object sender, FormClosingEventArgs e )
		{
			MessageBox.Show( "FormClosing();" );
		}

		private void Form1_FormClosed( object sender, FormClosedEventArgs e )
		{
			MessageBox.Show( "FormClosed();" );
		}

		// ユーザが定義する終了時のイベントハンドラ.
		private void MyEventHandler_ApplicationExit(object sender, EventArgs e)
		{
			MessageBox.Show( "ApplicationExit();" );
		}
	}
}

上記のコードを実行すると起動時にメッセージボックスが
"Form Constructor();"
"Load();"
の順で表示されます。

フォームの右上隅の [X] 閉じるボタンを押すとメッセージボックスが
"FormClosing();"
"FormClosed();"
"ApplicationExit();"
の順で表示されます。