我最近收到了一段(可怕的)代码要维护。其中一个问题是未处理的异常处理程序根本不起作用。我开始理解为什么,但它提出了我想要了解更多的问题。
简而言之,应用程序由具有STAThread
属性的静态Main方法启动。在此线程上显示一个LoginScreen(在STAThread上)。当用户输入其凭据时,会创建另一个线程,从而启动实际的用户界面。因此,实际用户界面在托管线程上运行(其公寓状态设置为ApartmentState.STA)。
事件Application.ThreadException
和AppDomain.CurrentDomain.UnhandledException
的订阅在“真实”STAThread上设置,而实际用户界面在“不同”STA线程上运行。
我遇到的问题是未处理的异常不被未处理的异常处理程序捕获。
当我也在“不同的”STA线程上订阅上述事件时,未处理的异常处理程序会捕获未处理的异常 。
我之前从未意识到这一点(我也从未在不同的线程上运行用户界面,而不是“主”线程...),但是必须订阅Application.ThreadException
(和/或{{ 1}})在实例化用户界面的相同线程上?或者调用AppDomain.CurrentAppDomain.UnhandledException
的同一个线程?两者似乎都不太可能,但显然我应该订阅哪些线程限制事件。
我真的很感激这个特定主题的更多背景知识。
如果我没有意义,或者描述我的问题做得很差,请发表评论。
原始问题here