C#异步方法失效问题排查:VS2015控制台应用代码分析
我来帮你排查这段代码的问题,先从最直接的错误说起,再聊聊异步使用的优化点:
1. 最核心的编译错误:缺失MyAsyncFun2方法的实现
你在Main方法里调用了MyAsyncFun2(),但代码里完全没有定义这个方法,这会直接导致编译失败,程序根本没法运行——这是当前无法正常工作的首要原因。
2. 异步等待方式可以优化
就算补上MyAsyncFun2,你当前用task1.Wait(); task2.Wait();逐个等待任务的方式虽然能运行,但不是最优解:这种方式会先等task1完成,再等task2,相当于把两个异步任务变成了串行执行,浪费了异步并行的优势。应该用Task.WhenAll来同时等待多个任务,让它们真正并行执行。
修正后的完整代码
using System; using System.Threading.Tasks; public class Example { public static void Main() { Console.WriteLine("Wait please...."); DateTime time1 = DateTime.Now; Task task1 = MyAsyncFun1(); Task task2 = MyAsyncFun2(); // 同时等待两个任务完成,充分利用异步并行能力 Task.WhenAll(task1, task2).Wait(); DateTime time2 = DateTime.Now; Console.WriteLine("time elapsed: " + (time2 - time1).TotalSeconds); Console.ReadLine(); } private static async Task MyAsyncFun1() { await Task.Yield(); // 模拟实际的异步耗时操作(比如IO请求、网络调用) await Task.Delay(1000); Console.WriteLine("MyAsyncFun1 finished"); } // 补充缺失的MyAsyncFun2方法实现 private static async Task MyAsyncFun2() { await Task.Yield(); // 模拟另一个异步耗时操作 await Task.Delay(1500); Console.WriteLine("MyAsyncFun2 finished"); } }
额外说明
await Task.Yield()的作用是让方法立即返回,把后续代码交给线程池执行,在控制台这种没有同步上下文的环境下使用是完全安全的。- 我给两个方法加了
Task.Delay来模拟实际的异步工作,如果你的真实代码里没有类似的异步操作(比如IO、网络请求),异步方法会瞬间完成,体现不出异步的效果。 - 因为你用的是VS2015,对应的C# 6版本不支持异步
Main方法,所以只能用Wait()来阻塞主线程等待任务完成——这在控制台应用里是安全的,不会出现死锁问题。
内容的提问来源于stack exchange,提问作者user3352251
相关产品推荐
相关产品推荐

