C#控制台程序执行CanConnectAsync后直接退出,未进入分支
控制台应用执行
await db.Database.CanConnectAsync()后直接退出,不进入分支 问题代码
public static void Main(string[] args) { Start(args); } private static async void Start(string[] args) { new ConfigurationBuilder().AddUserSecrets<Program>().Build().Providers.First() .TryGet("EFCoreTestDB", out string? dbString); Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.MSSqlServer( connectionString: dbString, sinkOptions: new() { TableName = "Log", AutoCreateSqlTable = true }) .WriteTo.Console() .WriteTo.File("logs/debug_log.txt", rollingInterval: RollingInterval.Day) .CreateLogger(); await using DatabaseContext db = new(); if (await db.Database.CanConnectAsync()) { //Breakpoint here does not trigger //Parsing methods } else { //Breakpoint here does not trigger Log.Fatal("Parser could not connect to DB!"); } }
问题现象
- 程序原本运行正常,当前调试时,执行完
if (await db.Database.CanConnectAsync())语句后直接关闭,未抛出任何异常 - if和else分支内的断点均未触发,确认代码未进入任何分支逻辑
- 数据库连接字符串
dbString有效,Serilog初始化过程中已输出敏感数据日志警告:
warn: 7/10/2024 11:09:07.079 CoreEventId.SensitiveDataLoggingEnabledWarning[10400] (Microsoft.EntityFrameworkCore.Infrastructure)
Sensitive data logging is enabled. Log entries and exception messages may include sensitive application data; this mode should only be enabled during development.
- 查阅
CanConnectAsync文档得知「尝试连接时抛出的任何异常都会被捕获且不会传播到应用程序」,但无法理解该机制与程序直接退出的关联,寻求解决思路。
问题原因与修复方案
核心原因
Start方法使用了async void返回类型,控制台应用的Main方法调用该方法后,不会等待异步操作完成,主线程执行到Main方法末尾就直接终止,导致后续的分支代码根本没机会执行。
修复步骤
- 修改
Start方法的返回类型为async Task:
private static async Task Start(string[] args) { // 保留原有的所有业务逻辑 }
- 将
Main方法改为异步并等待Start完成:
public static async Task Main(string[] args) { await Start(args); }
补充说明
async void仅适用于UI事件处理场景,在控制台或后台服务中使用会导致主线程无法追踪异步任务的执行状态,一旦主线程结束,整个进程就会终止,不管异步任务是否完成。- 你看到的Serilog警告是在
CanConnectAsync执行前输出的,说明dbString确实有效,但异步的CanConnectAsync还未执行完毕,主线程就已经退出了,所以分支代码从未被执行。
内容的提问来源于stack exchange,提问作者Lanolderen
相关产品推荐
相关产品推荐

