即使发生未处理的exception,也要保持应用程序运行

什么 ?
我正在开发一个控制台应用程序,需要继续全天候运行无问题什么
是否有任何方法可以阻止multithreading应用程序被“某个线程中的某个线程”中发生的某些未处理的exception炸毁?

为什么?
请不要提供诸如“你应该管理所有exception”,“这应该永远不会发生”等课程。我有我的理由:我们正在进行测试部署,我们需要保持运行,记录exception,然后重新启动所有线程。 如果发生任何计划外的事情并导致抛出未处理的exception,则需要检测它并调用某些方法重新启动所有线程(由于层设计,primefaces性不可能)

话虽这么说,我知道如果由于和UnhandledException(我已经实现过)爆炸,可能无法从“内部”重新启动应用程序。

到目前为止,我已经使用了Quartz.net的FileScan Job和一个Flag文件来检测这样的东西并从外部重启应用程序。 但这对我来说听起来很糟糕。 我想找一些更干净,更快捷,更脏的东西。

DownVoting / Sniping警告:我知道这可能不是“原样”。
请有创造力/乐于助人,而不是突然批评,并将此视为“公开问题”

您需要将事件处理程序附加到当前AppDomain上的UnhandledException事件:

AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler

在处理程序内部,您必须以某种方式保存足够的状态(到文件,数据库等),以便重新启动的应用程序传递给新线程。 然后通过调用System.Diagnostics.Process.Start("MyConsoleApp.exe")来实例化Console应用程序的新实例。

要非常小心地引入逻辑以避免连续的崩溃/重启/崩溃/重启循环。

如果它无论如何都要全天候运行,为什么不把它写成Windows服务并利用内置于windows中的恢复选项呢?

配置恢复服务

这种方法的另一个优点是能够在机器重启后继续存在,并且它将记录系统事件日志中的故障/重新启动。

  • 不能让一个过程“无论如何”运行。 如果这个过程被杀了怎么办?
  • 不想让一个进程“无论如何”运行。 如果进程状态被破坏,如果它继续运行会发生“坏事”,该怎么办?

我可以想到以下解决方案中的一些缺点,但对我来说这对我来说已经足够好了:

 static void Main() { AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException); CS = new ConsoleServer(); CS.Run(); } public static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e) { Exception exception = (Exception)e.ExceptionObject; Logger.Log("UNHANDLED EXCEPTION : " + e.ExceptionObject.ToString()); Process.Start(@"C:\xxxx\bin\x86\Release\MySelf.exe"); } 

如果您使用.Net 2.0及以上版本,答案是您不能。

在.NET Framework 1.0和1.1版中,运行时捕获在主应用程序线程以外的线程中发生的未处理exception,因此不会导致应用程序终止。 因此,可以在不终止应用程序的情况下引发UnhandledException事件。 从.NET Framework 2.0版开始,删除了子线程中未处理exception的这一支持,因为此类静默失败的累积影响包括性能下降,数据损坏和锁定,所有这些都难以调试。 有关更多信息,包括运行时未终止的案例列表,请参阅托管线程中的例外。

取自这里:

http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

如果你希望你的应用程序存活下来,那么你将需要非常积极的尝试/捕获你的方法,所以没有逃脱。

我会建议使用其他人提到的Windows服务。 它与控制台应用程序相同,但顶部有一些额外的服务层代码。 您可以使用控制台应用程序并轻松将其转换为服务应用程序。 只需要覆盖service.start / pause / stop方法。