c# C# 异步方法可以作为 Main 入口点吗

陌强同学_1382

陌强同学_1382

2026-01-11

168人浏览

原创

C# 7.2起支持async Main,合法签名仅四种:static async Task Main(string[] args)、static async Task Main(string[] args)、static async Task Main()、static async Task Main();不支持async void或非Task返回类型,因CLR需等待并获取退出码。

c# c# 异步方法可以作为 main 入口点吗

可以,C# 7.2 起就支持 async 入口点,但必须满足特定签名,否则编译失败。

async Main 方法的合法签名有哪些

C# 编译器只接受以下四种形式的 async Main,其他变体(比如带多个参数、返回 Task 以外类型)会报错 CS5001: Program does not contain a static 'Main' method suitable for an entry point:

  • static async Task Main(string[] args)
  • static async Task Main(string[] args)
  • static async Task Main()
  • static async Task Main()

注意:void 或 async void Main 不合法;Task 等非 int 或无返回值的 Task 也不行。

为什么不能用 async void Main

async void 是“火-and-forget”方法,无法被等待,运行时无法感知其完成状态。入口点若为 async void,进程可能在异步操作真正开始前就退出。

例如下面这段代码会直接退出,不打印任何内容:

static async void Main(string[] args)
{
    await Task.Delay(1000);
    Console.WriteLine("Done"); // 永远不会执行
}

这是因为 CLR 启动后调用 Main,看到是 void 就认为启动完成,立即终止进程。

JSON Toolkit
JSON Toolkit

JSON文件多功能工具。支持格式化、验证、压缩、键排序及点记法路径查询。零依赖。

下载

返回 Task 的实际意义

和同步 int Main() 一样,Task Main() 的返回值会作为进程退出码(exit code)。这在脚本集成或 CI 环境中很关键:

  • 成功逻辑返回 0
  • 错误场景可返回非零值(如 1、2)供外部判断
  • CLR 会自动 await 该 Task,再把结果传给操作系统

示例:

static async Task<int> Main(string[] args)
{
    try
    {
        await DownloadFileAsync("https://example.com/data.json");
        return 0;
    }
    catch (HttpRequestException)
    {
        Console.Error.WriteLine("Download failed");
        return 1;
    }
}</int>

项目 SDK 和语言版本要求

必须满足两个条件才能启用 async Main:

  • 项目文件中使用 netcoreapp3.1 或更高(.NET 5+ 更稳妥)
  • 至少为 7.2(显式指定或依赖 SDK 默认值)

如果用的是旧版 .NET Framework(如 4.8),即使装了新编译器,也不支持 —— 因为入口点机制由运行时实现,不是纯语法糖。

容易忽略的一点:某些 IDE(如老版本 Visual Studio)可能缓存项目属性,改完 .csproj 后需重启或清理 obj/ 目录才能生效。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js json 操作系统 c#

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7579

3

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7579

3

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.29

3605

6

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

2025.08.29

4748

10

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.29

3165

10

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.23

636

5

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

391

13

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

2026.11.12

100

15

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

2026.11.12

60

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.4万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.9万人学习