Application.ThreadException
이벤트의 처리를 의미하는 경우 : 예외에서만 발생하며 WinForms 스레드에서 발생합니다. 일반적으로 응용 프로그램에는 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) 기본 폼 (두 개의 버튼이있는 양식) 코드 숨김 :
를
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
이벤트가 발생하고 출력 창에 'Worker Thread'행을 생성하는 CurrentDomain_UnhandledException
이 호출됩니다.
스레드 예외가 잡히게 될 때까지 이미 스레드 예외가 발생하여 불행히도이 시점에서 스레드 ID를 얻을 수있는 방법이 없습니다. 당신이 할 수있는 최선의 방법은 Exception의 스택을 검사하여 예외를 던진 코드를 찾아내는 것입니다. 코드에서 수정할 수 있다면 스레드 ID를보고하기 위해 throw/catch 처리를 throwing 코드에 추가 할 수 있습니다. –
VS의 스레드 디버그 창에서 스레드를 살펴본 결과 스레드가 이미 파괴 된 것 같습니다. Duw – James
사실 이름은 사용 가능하지만 주 스레드는 VS 2010에서보고 한 내용에도 불구하고 이름이 없습니다. – James