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

.NET Core 3.1中async方法未等待导致代码执行异常求助

问题分析与解决

核心问题

你的代码存在两个关键问题,直接导致await操作出现看似“无报错异常”的表现:

  • Testy方法使用async void:C#中async void仅适用于事件处理逻辑,普通方法用此声明会让调用方无法追踪异步操作的完成状态,也无法捕获内部抛出的异常。
  • Main方法未等待异步操作完成:控制台程序的Main方法直接调用Testy()后,不会等待异步逻辑执行完毕就会推进流程,最终导致程序提前终止,await的网络请求还未完成就被强制中断,看起来像是“无报错的异常”。

修复步骤

1. 修改Testy方法的返回类型

将async void改为async Task,让调用方可以等待异步操作完成:

public static async Task Testy()
{
    // 原有代码逻辑保持不变
}

2. 修改Main方法以等待异步操作

在.NET Core 3.1中,控制台程序的Main方法可以直接声明为async Task,通过await等待Testy执行完毕:

public static async Task Main(string[] args)
{
    Console.WriteLine("Hello World!");
    await Testy();
}

3. 可选:添加异常捕获便于排查

为了后续定位潜在问题,可以在Testy中增加异常捕获逻辑:

public static async Task Testy()
{
    try
    {
        using (var client = new HttpClient())
        {
            string url = @"https://jackfinlay.com";

            HttpResponseMessage response = await client.GetAsync(url);
            // 确保请求成功,否则抛出异常
            response.EnsureSuccessStatusCode();

            string html = await response.Content.ReadAsStringAsync();

            JsonizeParser parser = new JsonizeParser();
            JsonizeSerializer serializer = new JsonizeSerializer();
            Jsonizer jsonizer = new Jsonizer(parser, serializer);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"错误信息:{ex.Message}");
        // 输出完整异常栈便于深度排查
        Console.WriteLine(ex.ToString());
    }
}

问题根源解释

当你调用async void的Testy方法时,Main方法不会等待异步逻辑执行,程序会在Main执行完毕后立即退出。此时await client.GetAsync(url)还在后台执行,程序终止会直接中断该异步操作,导致你看不到执行结果也无报错提示,误以为是“异常”。

内容的提问来源于stack exchange,提问作者Mauricio Hernández Cabrera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:18:32