イベントの処理を意味するApplication.ThreadException
場合:WinFormsスレッドからスローされた例外に対してのみ発生します。通常、アプリケーションにはメインスレッドという1つのWinFormsスレッドがあります。
アップデート。
Application.ThreadException
これは、AppDomain.UnhandledExceptionの動作の違いを示すサンプルです。
1)Program
クラス:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.Run(new Form1());
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Debug.WriteLine(Thread.CurrentThread.Name);
}
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
Debug.WriteLine(Thread.CurrentThread.Name);
}
}
2)メインフォーム(2つのボタンがあるフォーム)コードビハインド:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
throw new InvalidOperationException();
}
private void button2_Click(object sender, EventArgs e)
{
new Thread(() => { throw new InvalidOperationException(); })
{
Name = "Worker Thread"
}.Start();
}
}
button1をクリックすると、WinFormsスレッドから例外がスローされます。したがって、この例外はApplication_ThreadException
デフォルトで処理されます。
button2をクリックすると、WinFormsスレッドではないワーカースレッドから例外がスローされます。Application.ThreadException
この場合は発生しませんが、代わりにAppDomain.UnhandledException
イベントが発生しCurrentDomain_UnhandledException
ます(呼び出され、出力ウィンドウに「WorkerThread」行が生成されます)。