1. 异步编程基础与核心概念
在C#开发中,异步编程是现代应用程序开发的基石。传统的同步代码执行方式会导致线程阻塞,特别是在处理I/O密集型操作时(如文件读写、网络请求等),会造成资源浪费和响应延迟。异步编程模型(APM)通过非阻塞方式解决了这些问题。
async和await是C# 5.0引入的关键字,它们构成了基于任务的异步模式(TAP)的核心。async用于标记一个方法为异步方法,而await用于暂停当前方法的执行,直到等待的异步任务完成。这种语法糖使得异步代码的编写和阅读几乎与同步代码一样直观。
重要提示:async方法必须返回Task、Task
或ValueTask 类型。void返回类型仅用于事件处理程序,因为它无法被await且异常无法被捕获。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码深度解析与执行流程
让我们拆解示例代码的执行逻辑:
csharp复制static async Task Main(string[] args)
{
Console.WriteLine("------------------------");
Console.WriteLine("这是传统的C#程序结构");
Task task1 = DoWork1Async(); // 启动第一个异步任务
Task task2 = DoWork2Async(); // 启动第二个异步任务
await Task.WhenAll(task1, task2); // 等待所有任务完成
Console.WriteLine("程序执行完成");
Console.WriteLine("------------------------");
}
这段代码展示了几个关键点:
- 异步Main方法(C# 7.1引入的特性)
- 并行启动多个异步任务
- 使用Task.WhenAll等待所有任务完成
2.1 任务启动与执行时序
当调用DoWork1Async()和DoWork2Async()时:
- 方法立即返回一个Task对象,表示异步操作的"票据"
- 实际工作开始在线程池线程上执行
- 控制权立即返回给调用者
两个任务的延迟时间不同(5秒和3秒),这让我们可以观察到真正的并
