我有一个exe(让我们说A)负责向员工发送电子邮件。 在某些时候可能是因为没有处理某些错误,它会在下面的对话框中抛出运行时错误。
“MainApplication.exe中发生了'System.IndexOutOfRangeException'类型的未处理异常”。
除非有人进入服务器并重新启动应用程序,否则它将保持不变。 我知道通过做错误处理,我可以保持谨慎,我想要替代解决方案自动终止此过程并重新启动它。
我做了另一个应用程序B - System.Diagnostics.Process process = new System.Diagnostics.Process(); process.StartInfo.FileName = @“..... \ MainApplication.exe”;
并且我试图找出是否发生了任何运行时错误然后我可以终止该进程并重新开始它。
1)exe A代码中是否有任何规定可以自动终止进程并自动删除该对话框? 2)如果不可能,则可以使用其他应用程序B来捕获和终止该过程。
欢迎任何其他建议! 感谢您的帮助。
答案 0 :(得分:1)
如果A.exe
是Windows服务(即在.NET中实现,其主类派生自ServiceBase
),则可以将其配置为由系统自动重新启动。 (请参阅services.msc
中的服务属性的“恢复”选项卡。)
对于在Windows中长期运行的任何内容,服务是最好的方法,但如果不这样写,则可能需要重写。
备选方案:
A.exe
是否正在运行,如果没有启动它。如果A.exe
在任何时候只有一个实例,这是最简单的。A.exe
的最终(最外层)异常处理程序中,在退出(并记录失败)之前启动一个新实例。但是,这些都应该被看作是在作为服务实施之前的解决方法。
答案 1 :(得分:1)
看门狗的问题是他们自己很容易失败。如果您在应用A中遇到未处理的异常,是什么让您认为您在应用B中不会遇到相同的条件?
您应该研究的是正确挂钩未处理的异常事件:
AppDomain.UnhandledException
Application.ThreadException
WindowsFormsApplicationBase.UnhandledException
处理这些事件的正确方法,以及适用于哪种情况的事件,是一个相当冗长的主题。阅读上面的链接了解更多详情。另请阅读Application.SetUnhandledExceptionMode
。
通过捕获这些未处理的异常,您可以通过显式退出来禁止默认对话框行为。传统上还有一个注册表项,请参阅How to turn off/disable the .NET JIT Debugging Dialog,但挂钩未处理的异常处理程序事件是一种更好的方法。