19.1 异步编程概述
异步编程允许程序在等待耗时操作时继续执行其他任务。
同步问题
1 | // 同步方式 - 会阻塞线程 |
异步方式
1 | // 异步方式 - 不阻塞线程 |
19.2 async 与 await
基本用法
1 | // 定义异步方法 |
异步方法签名
1 | // 无返回值 |
19.3 Task 与 Task
创建 Task
1 | // Task.Run 在线程池执行 |
Task 方法
1 | // 等待所有任务完成 |
19.4 ConfigureAwait
1 | // UI 应用中保持上下文 |
19.5 异常处理
1 | public async Task ProcessAsync() |
19.6 取消操作
1 | public async Task ProcessWithCancellationAsync(CancellationToken ct) |
19.7 并行处理
1 | // 并行执行多个独立任务 |
19.8 异步最佳实践
1. Async 贯穿始终
1 | // 不推荐:同步阻塞 |
2. 避免 async void
1 | // 不推荐 |
3. 使用 ValueTask
1 | // 减少分配(适用于常用结果) |
19.9 本章小结
async标记异步方法,await等待异步操作Task无返回值,Task<T>带返回值Task.WhenAll等待所有,Task.WhenAny等待任意ConfigureAwait(false)避免上下文切换CancellationToken支持取消操作- 异步异常用
try-catch捕获 - 使用 SemaphoreSlim 限制并发
练习题
- 编写异步方法下载文件并显示进度
- 使用
Task.WhenAll并行处理多个请求 - 实现可取消的异步操作
- 以下代码输出什么?
1
2
3
4
5
6
7async Task PrintAsync()
{
await Task.Delay(100);
Console.WriteLine("World");
}
Console.Write("Hello ");
await PrintAsync();