You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让可作为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:55:14