Если я присваиваю ThreadExceptionEventHandler
Application.ThreadException
, почему при вызове метода делегата с использованием элемента управления в главном потоке приложения возникают исключения, вызываемые этим делегатом, не вызывающим обработчик события?
т.е.
static void Main()
{
...
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.Run(new Form1());
}
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
Console.Error.Write("A thread exception occurred!");
}
...
private void Form1_Load(object sender, EventArgs e)
{
Thread syncThread = new Thread(new ThreadStart(this.ThrowException));
syncThread.Start();
}
private void ThrowException()
{
button1.Invoke(new MethodInvoker(delegate
{
// Not handled by ThreadExceptionEventHandler?
throw new Exception();
}));
}
Контекст в этом заключается в том, что у меня есть фоновый поток, запущенный из формы, которая выдает необработанное исключение, которое завершает приложение. Я знаю, что этот поток будет ненадежным, поскольку он зависит от подключения к сети и поэтому может быть прерван в любой момент, но мне просто интересно, почему этот сценарий не работает так, как я ожидаю?