Да, Application.ThreadException может перехватывать только те исключения, которые возникают в потоке пользовательского интерфейса. В коде, который запускается из-за уведомлений Windows. Или с технической точки зрения, события, которые запускаются циклом сообщений. Большинство событий Winforms соответствуют этой категории.
То, что он делает not trap, это исключения, возникающие в любом потоке, не являющемся пользовательским интерфейсом, например, рабочий поток, запущенный с Thread.Start (), ThreadPool.QueueUserWorkItem или метод BeginInvoke () делегата. Любое необработанное исключение в этих случаях прекратит работу приложения, AppDomain.UnhandledException - последний вздох.
Если пойти дальше, аппаратные исключения, которые возникают в неуправляемом потоке собственным кодом, который никогда не совершал управляемого вызова CLR, не могут быть обнаружены ни одним механизмом CLR. AccessViolation (код исключения 0xc0000005) является наиболее распространенной причиной смерти. Единственный способ перехватить их - через Windows API SetUnhandledExceptionFilter (). Это трудно понять правильно.
Вы можете отключить Application.ThreadException с помощью Application.SetUnhandledExceptionMode (). Что является мудрым решением, предоставление пользователю опции «Продолжить» не имеет большого смысла. Теперь все исключения в управляемых потоках ведут себя одинаково, используйте AppDomain.UnhandledException для их регистрации.