如何运行C#控制台应用程序(如果崩溃)
你可以尝试这样的事:
static void Main(string[] args)
{
try
{
// Application code goes here
}
catch (Exception)
{
var applicationPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
Process.Start(applicationPath);
Environment.Exit(Environment.ExitCode);
}
}
基本上,包装所有的代码在try/catch
,如果任何异常发生时,程序将与System.Reflection.Assembly.GetExecutingAssembly().Location;
检索.exe
位置,然后调用Process.Start
运行再次申请。
我宁愿处理AppDomain.CurrentDomain.UnhandledException事件,而不是此解决方案。因此,您可以在可以从中恢复的情况下使用try/catch。 –
如果发生堆栈溢出或超出记忆异常等异常,此功能将不起作用 –
在异常情况下物理退出和重新启动有什么意义? – ThePerplexedOne
您应该从另一个应用程序(看门狗,sheduler,procmon,servman,...)控制您的控制台应用程序。
E.g.您可以将您的控制台应用程序创建为服务并通过服务管理器进行控制。
您可以使用一个看门狗处理您的显示器,并重新启动它,如果坠毁: 见:What's the best way to watchdog a desktop application?
您可以使用Windows服务,而不是和设置它的恢复选项,如下所示:https://serverfault.com/questions/48600/how-can-i-automatically-restart-a-windows-service-if-it-crashes
您可以使用任务管理器中的计划任务定期启动应用程序,并将其设置为仅在上次运行已结束时才启动: https://support.microsoft.com/en-us/kb/323527
如果我正确理解您的问题,您希望在发生崩溃时尝试重新启动控制台应用程序。在C#console-apps中,定义为入口点的方法(通常为static void main
)是应用程序中调用堆栈的根。您基本上需要递归调用该方法。如果应用程序处于某种意外或不可恢复的状态,您将需要确保应用程序最终失败。
例如,在主类:
static int retryCount;
const int numberOfRetries = 3;
static void Main(string[] args)
{
try
{
var theApp = new MyApplicationType(args);
theApp.StartMyAppLogic();
}
catch (ExpectedExceptionType expectThisTypeOfException)
{
thisMethodHandlesExceptions(expectThisTypeOfException);
}
catch (AnotherExpectedExceptionType alsoExpectThisTypeOfException)
{
thisMethodHandlesExceptions(alsoExpectThisTypeOfException);
}
catch (Exception unexpectedException)
{
if(retryCount < numberOfRetries)
{
retryCount++;
Main(args);
}
else
{
throw;
}
}
}
感谢您修复我的错误代码@FrédéricHamidi! –
没问题。这不是*那*不好;) –
你运行它。如果它意外消失,它会崩溃。:-)。但是,严肃地说,你是什么意思? –
您可以从使用System.Diagnostics的其他应用程序启动,也可以使用Windows任务计划程序启动它。我们需要一些更多的信息才能更有帮助 –
您的控制台应用程序是否返回零以外的“成功”退出代码。然后编写一个启动程序启动它,然后等待它退出。如果退出代码不是特殊的“成功”代码,请再次启动控制台应用程序。 –