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

C#异步方法await用法疑问:程序提前终止及冗余await处理方案

问题原因

  • 你当前的Main方法是同步方法,调用Test()时仅触发了异步任务的启动,没有等待该异步任务执行完成。当Main方法执行完毕后,进程会直接终止,所有未完成的后台异步任务都会被强制结束,因此await Test2();之后的代码没有机会运行。

修复方案

有两种常用修改方式:

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

将Main方法修改为异步返回Task,并等待Test()执行完成:

public static async Task Main()
{
    await new Program().Test();
}

方式2:同步等待任务完成(兼容旧版本C#)

调用Wait()方法阻塞等待异步任务执行完成:

public static void Main()
{
    new Program().Test().Wait();
}

修改后程序就会完整输出三行预期内容。

关于冗余await的疑问

如果await是方法的最后一行代码,确实可以移除async/await关键字,直接返回Task对象即可,不需要额外的异步状态机开销,修改后的Test2写法如下:

public Task Test2() 
{
    Console.WriteLine("Task in delay...");
    return Task.Delay(5000);
}

修改后完全不影响外部调用逻辑,依然可以用await Test2()正常等待执行,效果和原来带async/await的版本完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:06:01