这与之前的问题有关.
我现在想要了解的是如何防止UI线程异常终止应用程序,而非UI异常不能.
供参考,请参阅此示例.
最重要的是,在这种情况下我希望能够"静默地"终止进程 - 不显示Windows对话框,询问我是否要发送错误报告.
这是我的AppDomain UnhandledExceptionHandler:
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
try
{
// Maybe do some logging here if allowed
}
catch
{
}
// then just terminate the application
Application.Exit();
}
Run Code Online (Sandbox Code Playgroud)
更新
根据本回答中的评论,我想澄清一点,最重要的是,我想了解更多关于使UI线程尽早通过该Application.ThreadException机制捕获未处理异常的机制.是否可以在非UI线程上实现此类行为.
可能是以下副本:我可以阻止其他AppDomain中未捕获的异常关闭应用程序吗?
一直在努力找出这个问题的答案.
只是想确保答案确实没有,在我扔掉所有代码之前,我将其驱动程序隔离在他们独立的应用程序域中并用旧式流程替换它.
所以正式的问题是这个.
我有一个默认域名"ad-default",我在其中创建了一个新的appdomain"ad-hosted",我可以避免"ad-hosted"中未处理的例外情况会删除"ad-default"吗?
我知道我可以通过连接到"广告托管"域的UnhandledException事件来观察异常,但我找不到阻止它们传播到"ad-default"域的方法.
这是真的吗?但是,如果他们不提供隔离,为什么我们甚至会想要AppDomain呢?
编辑:遗憾的是答案没有,请参阅此答案进行解释: AppDomain,处理异常
我目前正在编写一个托管多个模块的服务器.服务器在单独的AppDomain中运行每个模块.我想要实现的是异常隔离,即当一个模块抛出异常时,我不希望整个进程终止,只是这个特定的AppDomain.我知道,当吞下不同线程中所有未捕获的异常时,我可以告诉CLR回退到旧行为(.NET 1.0).但是,这不是最"优雅"的解决方案.
我正在编写一些可以加载第三方程序集的c#.
如果第三方决定是恶意的,他们可以编写一个递归函数,最终会出现在StackOverflowException中,从而导致我的应用程序崩溃.
是否可以检测递归函数?
更新: 对于像while(true)或(;;)这样的不良状态,我已经有了解决方案.本质上,我在一个单独的线程中运行第三方代码,如果线程花费的时间超过固定的持续时间,我就拔掉插件.这不适用于递归,因为达到堆栈限制非常快.
更新: 也许我错误地表达了我所追求的解决方案.如果我最终得到大量故意恶意代码,我将更改应用程序以在单独的进程中运行第三方代码.但是在这个阶段,我假设代码只会导致问题,因为它编写得很糟糕.
接受的答案 我已经决定最好的方法是在一个单独的过程中运行第三方库.我可以运行多个进程实例,甚至可以跨进程对我的第三方库进行一种负载平衡.如果执行杀死其中一个进程的恶意代码,我应该能够检测到哪个库将其杀死,将该库标记为恶意,并使用所有非恶意库重新启动该进程.
感谢大家的好建议!