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

已使用await但Func未调用第二个方法,Class B控制台无输出

问题原因及解决方案

核心问题是主线程没有等待异步任务执行完成就提前终止了:

  • 你的Main方法是同步方法,调用GetRes后只是获取了返回的Task对象,但没有等待这个任务完成。主线程执行完Main方法的代码后,就会直接结束整个进程。
  • Class B的GetUser里用Task.Run开启了后台线程执行输出逻辑,进程终止时后台线程会被强制中断,导致Class B的控制台输出还没来得及打印就被终止了。
  • 当你把控制台语句移出Task.Run时,代码变成同步执行,在主线程结束前就完成了所有输出,所以能看到Class B的内容。

解决方法

方法1:使用异步Main方法(C# 7.1及以上版本支持)

修改Main方法为异步,直接等待GetRes完成:

static async Task Main(string[] args)
{
    await GetRes(async (imy) => await imy.GetUser());
}

方法2:阻塞主线程等待任务完成

如果无法使用异步Main,可以调用Wait()或GetAwaiter().GetResult()来阻塞主线程,直到异步任务全部执行完毕:

static void Main(string[] args)
{
    var task = GetRes(async (imy) => await imy.GetUser());
    task.Wait(); // 或者 task.GetAwaiter().GetResult();
}

本质上,你已经在GetRes里正确await了两个GetUser任务,但调用GetRes的地方必须等待整个异步链完成,否则主线程提前退出会打断后续的异步操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:27:26