C# 如果控制台应用程序崩溃,如何重新启动它?
我已经用C#创建了一个控制台应用程序。如何编程此应用程序,使其在崩溃后重新启动?您可以尝试以下方法:C# 如果控制台应用程序崩溃,如何重新启动它?,c#,.net,console-application,C#,.net,Console Application,我已经用C#创建了一个控制台应用程序。如何编程此应用程序,使其在崩溃后重新启动?您可以尝试以下方法: static void Main(string[] args) { try { // Application code goes here } catch (Exception) { var applicationPath = System.Reflection.Assembly.GetExecutingAssembly()
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.getExecutingGassembly()位置检索.exe
位置
然后调用进程。启动
再次运行应用程序。您应该从另一个应用程序(看门狗、调度程序、procmon、servman等)控制控制台应用程序
例如,您可以将控制台应用程序创建为服务,并通过service manager进行控制
如果我正确理解您的问题,您希望在发生崩溃时尝试重新启动控制台应用程序。在C#控制台应用程序中,定义为入口点的方法(通常
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;
}
}
}
static int retryCount;
常数int numberOfRetries=3;
静态void Main(字符串[]参数)
{
尝试
{
var theApp=新的MyApplicationType(args);
theApp.StartMyAppLogic();
}
捕获(ExpectedException类型expectThisTypeOfException)
{
此方法处理所有异常(除此类型的异常外);
}
catch(另一个期望的异常类型也期望此异常类型)
{
此方法处理所有异常(也不包括此类型的异常);
}
捕获(异常未预料的异常)
{
if(重试次数<重试次数)
{
retryCount++;
Main(args);
}
其他的
{
投掷;
}
}
}
您可以运行它。如果它意外消失,它将崩溃。:-。但说真的,你是什么意思?你可以使用System.Diagnostics从另一个应用程序启动,也可以使用Windows任务计划程序启动。我们需要更多的信息来帮助您让您的控制台应用程序返回除零以外的“成功”退出代码。然后编写一个启动器应用程序来启动它,并等待它退出。如果退出代码不是特殊的“成功”代码,请再次启动控制台应用程序。我更希望处理AppDomain.CurrentDomain.UnhandledException事件,而不是此解决方案。因此,您可以在可以恢复的情况下使用try/catch。在出现堆栈溢出或内存不足等异常的情况下,这将不起作用。在出现异常的情况下,物理退出并重新启动有什么意义?没问题。没那么糟;)