/* Page prose (zh-Hans) */
"WrappingUp" = "# 小结\n\n`async`/`await` 的要点是等待却不阻塞的代码：它从上到下读下来，同时线程仍然空闲着去做别的工作。要牢牢抓住的一个想法是，`await` 标出的是一个你的函数可以 *暂停并把它的线程交还回去* 的地方，而不是一个它会冻住的地方。下面的一切都源自把这幅画面理解对。\n\n* 一个 **`async`** 函数可以暂停和恢复；你用 **`await`** 来调用它，那是一个 *可能的* 挂起点，它会释放线程而不是冻住线程。\n* **任务不是线程。** Swift 把许多任务多路复用到一个小小的协作式线程池上（~每个核心一个线程）；一个挂起的任务会交还它的线程，并可能在另一个线程上恢复。阻塞一个池中线程（比如 `Thread.sleep`）是经典的错误：挂起，别阻塞。\n* 陷阱：不要一前一后地 await 互相独立的工作；两个顺序的 `await` 会把它们的等待叠加起来（那杯意外的 2 秒拿铁）。用 **`async let`** 一次性启动互相独立的工作，好让等待重叠、总时间缩短。\n* 陷阱：一个你从不 `await` 的 `async let`，会在作用域结束时被取消，其结果被丢弃。`async let` 是一个 *await 的承诺*：要兑现它。\n* 你只能在异步上下文中 `await`；用 **`Task { }`** 从同步代码跨越过去（顶层的 `await` 无法编译）。\n* **`async throws` + `try await`** 把错误带回到朴素的 `do-try-catch`，比 completion handler 的错误管道干净得多。忘记 `try` 是一个编译错误，而不是一个悄无声息的 bug。\n\n---\n\n## 接下来\n\n[任务与取消](Tasks%20and%20Cancellation.playgroundchapter/Overview)：`Task` 究竟是什么、任务如何形成一棵树，以及如何停止你不再需要的工作。\n\n[上一页](@previous)  |  第 8 / 8 页";
