ThreadExceptionEventHandler и вызов делегатов - PullRequest
3 голосов
/ 03 марта 2011

Если я присваиваю 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();
    }));
}

Контекст в этом заключается в том, что у меня есть фоновый поток, запущенный из формы, которая выдает необработанное исключение, которое завершает приложение. Я знаю, что этот поток будет ненадежным, поскольку он зависит от подключения к сети и поэтому может быть прерван в любой момент, но мне просто интересно, почему этот сценарий не работает так, как я ожидаю?

1 Ответ

4 голосов
/ 03 марта 2011

Вместо этого используйте AppDomain.CurrentDomain.UnhandledException, чтобы перехватывать исключения, возникающие в потоках, которые не созданы и не принадлежат Windows Forms

Вы должны обязательно прочитать статью MSDN , чтобы устранить эту проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...