gpt4 book ai didi

c# - 劫持 UnhandledException 以保持多线程应用程序运行

转载 作者:太空狗 更新时间:2023-10-29 19:39:46 26 4
gpt4 key购买 nike

情况
好吧,正如您在下面看到的,我有一个主应用程序,它创建了一个线程,它创建了一堆后台 worker 。当 RunWorkerCompleted 在某些 BG worker 上被触发时,我有时最终会丢弃一个未处理的异常,(出于我已经明确指出的原因,但这不是问题所在)。

architecture

因此日志清楚地显示我的 UnhandledException 处理程序已进入并报告异常。我知道我通过使用 Console.Read() 阻止应用程序退出来故意滥用 OnUnhandledException。我是故意这样做的,因为我希望在终止应用程序之前进行人为干预/检查。

    public static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Logger.log("UNHANDLED EXCEPTION : " + e.ExceptionObject.ToString());
Mail.Sendmail("ADMIN ALERT : " + e.ExceptionObject.ToString());
Console.Read(); // Yes, this is an ungraceful trick, I confess.
}

然而,在手动退出之前本来应该只是一个“暂停”,结果却让应用程序保持事件状态,即线程仍在生成工作人员,并且好像什么都没发生一样运行。更奇怪的是:当 UnhandledException 再次发生时,它仍然会不时地被丢弃。并且每次都会记录下来,表现得就像是一个普通的 ol' try catch。(这是 .Net 3.0 之前的默认行为)

问题
那么,为什么一切都像没有抛出 UnhandledException 一样发生,而线程和 BG 却像什么都没发生一样继续运行? 我的猜测是,只要 OnUnhandledException 处理程序没有完成,并且应用程序仍然存在,所有仍然存在的正在运行的线程就会继续存在于自由世界中并完成它们的工作。

这给了我一个不好的诱惑,那就是保留这个设计,作为对未处理异常的尝试/捕获
我知道这不是一个整洁的想法,因为你永远不知道如果异常严重或可以跳过。但是,我真的更希望我的程序整天保持运行并查看日志报告/邮件警报并自行决定是否需要重新启动。由于这是一个需要 24/7 全天候运行的服务器应用程序,因此我想避免由于未处理的小异常而导致不合时宜和重复的中断。这样做的最大优势是,在我们逐一跟踪未处理的异常并在它们发生时提供补丁来处理它们的同时,服务器程序保持运行。

感谢您的耐心等待,欢迎随时提供反馈。

PS:不,我没有吸大麻。

最佳答案

My guess is that as long as the OnUnhandledException handler is not done, and the App is still alive, all running threads that are still alive keep on living in a free world and doing their job.

正确。但是您的其他线程现在正在一个可能不稳定的过程中完成它们的工作。当发生未处理的异常时,有充分的理由终止应用程序。

I would really prefer my program to keep running

除了(潜在的)稳定性问题之外,您还会累积未处理处理中涉及的任何内容的停止状态。我的猜测是你至少会在每次发生时泄漏一个线程。你不能放过太多。

所以这将是一个非常糟糕的设计,只会延迟崩溃。

关于c# - 劫持 UnhandledException 以保持多线程应用程序运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8924261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com