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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:14:47