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

C#控制台应用中async/await的正确使用及异步调用后输出异常类型信息的问题解决

正确在C#控制台应用中使用async/await并修复你的代码问题

首先,你的代码有两个核心问题:一是直接打印了Task对象本身而非其异步执行的结果,二是使用Wait()这种阻塞式调用不符合async/await的最佳实践,还可能引发死锁风险。下面一步步帮你修正:

1. 改用async Main方法(C#7.1+支持)

从C#7.1开始,控制台应用的Main方法可以标记为async Task,这样就能直接在里面使用await,避免阻塞式调用:

public class Program 
{ 
    // 改为async Task Main,支持直接用await
    static async Task Main(string[] args) 
    { 
        DB dB = new DB(); 
        IUnitOfWork unitOfWork = new UnitOfWork(dB); 
        // 使用await获取异步方法的实际结果,而非持有Task对象
        IEnumerable<User> users = await unitOfWork.UserRepository.FindAll(); 
        
        // 遍历用户列表输出具体内容,而非打印Task实例
        foreach (var user in users)
        {
            Console.WriteLine($"用户ID: {user.Id}, 用户名: {user.Username}");
            // 根据你的User模型实际字段调整输出内容
        }
    } 
}

2. 理解为什么原来的输出不符合预期

你之前的代码里Console.WriteLine(users)打印的是Task<IEnumerable<User>>对象的默认ToString()结果,也就是你看到的那串长字符串。只有通过await(或不推荐的Task.Result)才能获取到异步方法执行后返回的用户列表数据。

3. 异步编程的最佳实践提醒

  • 尽量避免在异步代码中使用Wait()或Task.Result,尤其是在UI线程或ASP.NET环境中,这类阻塞式调用极易引发死锁。
  • 遵循「异步到底」原则:如果某个方法用了async/await,调用它的方法也应该异步化,直到顶层入口(比如这里的async Main)。
  • 你的FindAll()方法实现是没问题的,它正确使用ToListAsync()异步查询数据库,不需要修改。

验证修正后的效果

运行修正后的代码,程序会异步获取数据库中的用户列表,然后逐个打印用户的具体信息,而非输出Task对象的描述字符串。

内容的提问来源于stack exchange,提问作者Dale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:47:44