在.NET 6中异步调用异步方法,如何实现指定输出顺序?
.NET 6异步方法执行顺序问题解决
需求与问题
核心需求
- 保证Func1、Func2、Func3三个异步方法能完整执行完成
- Main方法先执行完毕并输出
finished - 之后依次输出
SomeClass In Func1、SomeClass In Func2、SomeClass In Func3
原代码问题
- 使用
await inst.Functon1():Main方法会被阻塞,必须等所有异步方法执行完才会输出finished,顺序不符合要求 - 直接调用
inst.Functon1()不加await:Main执行完后程序立即终止,异步任务没有机会执行,仅输出finished
解决方案
修改Main方法的执行逻辑,先启动异步任务、输出finished,最后等待异步任务完成,确保所有方法执行完毕:
using System; using System.Threading.Tasks; public class Program { static async Task Main(string[] args) { var inst = new SomeClass(); // 启动异步任务,保留任务引用,此时任务已开始执行 var asyncTask = inst.Functon1(); // Main优先输出finished Console.WriteLine("finished"); // 等待异步任务链执行完成,确保所有输出都能打印 await asyncTask; } } public class SomeClass { public async Task Functon1() { await Task.Delay(1000); Console.WriteLine("SomeClass In Func1"); await Functon2(); } private async Task Functon2() { await Task.Delay(3000); Console.WriteLine("SomeClass In Func2"); await Functon3(); } private async Task Functon3() { Console.WriteLine("SomeClass In Func3"); } }
原理说明
- 先调用
inst.Functon1()并保存返回的Task对象,此时异步任务已经启动(进入Task.Delay(1000)的等待阶段) - Main方法继续执行,直接输出
finished,满足"Main先完成输出"的要求 - 最后
await asyncTask会等待整个异步方法链(Func1→Func2→Func3)执行完成,确保所有异步方法的输出都能被打印,同时不会阻塞Main输出finished的步骤
执行结果
运行后输出顺序完全符合期望:
finished SomeClass In Func1 SomeClass In Func2 SomeClass In Func3
内容的提问来源于stack exchange,提问作者oceano1970526
相关产品推荐
相关产品推荐

