我最初的误解
刚接触时,我以为 async 会自动开新线程。后来才弄清:
它更像是在等 I/O 时把控制权交还给调用方,让程序不至于干等。
一个最小例子
public async Task<string> ReadNoteAsync(string path)
{
return await File.ReadAllTextAsync(path);
}
方法名加 Async 后缀,返回 Task / Task<T>,内部真正等待时再写 await。
自己常提醒的几点
- 能异步就别在异步链路里再
.Result/.Wait(),容易死锁或卡顿。 - 没有真正的 await 时,不必硬加 async,徒增状态机开销。
- 异常会封装在 Task 中,记得在合适的层级捕获。
- UI 或请求上下文里,搞清是否需要回到原上下文。
练习方式:先把「读文件 / 发请求」这类 I/O 场景改成异步,
比一上来纠结线程池细节更有体感。