如何让可作为Windows Service运行的控制台应用出错时保持窗口开启?
解决Windows Service控制台应用出错后窗口自动关闭的问题
问题核心在于CreateHostBuilder(args).Build().Run()执行时若抛出异常,程序会直接终止,根本不会执行后续的Console.ReadLine()。要实现出错后保持窗口不关闭,需要把启动逻辑包裹在异常捕获块中,捕获错误后输出信息并等待用户输入。
修改后的代码如下:
public class Program { public static void Main(string[] args) { try { CreateHostBuilder(args).Build().Run(); } catch (Exception ex) { // 高亮显示错误信息,便于识别 Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($"应用启动失败: {ex.Message}"); Console.WriteLine($"错误堆栈详情:\n{ex}"); Console.ResetColor(); // 仅在交互式控制台运行时等待输入(服务模式下自动跳过) if (Environment.UserInteractive) { Console.WriteLine("\n按任意键关闭窗口..."); Console.ReadKey(true); } } } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>() .UseUrls("http://0.0.0.0:5678", "https://0.0.0.0:5678"); }).UseWindowsService(); }
关键细节说明:
- 异常捕获:通过
try-catch包裹启动代码,确保所有启动阶段的异常都能被拦截,避免程序直接崩溃退出 - 错误输出:用红色字体突出错误提示,同时打印完整异常堆栈,方便快速定位问题根源
- 环境判断:
Environment.UserInteractive会区分控制台交互运行和服务运行模式——作为Windows Service运行时该值为false,不会触发等待输入的逻辑,不影响服务正常运行 - 输入等待:使用
Console.ReadKey(true)代替Console.ReadLine(),用户按任意键即可关闭窗口,操作更便捷
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

