已使用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
相关产品推荐
相关产品推荐

