/* Page prose (zh-Hans) */
"CooperativeCancellation" = "# 协作式取消\n\n这里就是让所有人都吃惊的部分。**取消一个任务并不会停止它。**\n\n当你调用 `task.cancel()` 时，Swift 设置一个标志：`isCancelled` 对那个任务及其所有子任务变成 `true`。这就是它做的*全部*。它从不夺走 CPU，从不朝你的循环中间抛出，从不强迫返回。正在进行的工作会一直运行，直到它自愿*检查*那个标志并决定停止。这叫作**协作式取消**：系统请求，而你的代码配合。\n\n所以可取消的代码必须*去看*。有三种去看的方式：\n\n* **`Task.isCancelled`**：一个你随时都能读取的 `Bool`。检查它，然后提前返回。\n* **`try Task.checkCancellation()`**：如果已取消就抛出 `CancellationError`，所以一行既检查又退出。\n* **`Task.sleep`**，它已经替你检查了：如果任务在睡眠期间被取消，`Task.sleep` 会抛出 `CancellationError`，而不是把时间等满。\n\n让我们来构建真正的东西：一个长时间运行的工作，我们在中途取消它，然后看它*迅速*停下来，因为它在每一步之间都做检查。想象咖啡师为一个大型宴席订单一批一批地研磨咖啡豆。";
"CooperativeCancellation-2" = "**观察运行：**你会看到几行 `Grinding batch...`（考虑到时间，大约三行），然后是 `>>> Order cancelled`，然后是 `Grinder stopped early...`。研磨循环当时正处在第四或第五批，但它没有把全部二十批磨完，而是在被取消后的一步之内就停了下来。是两处检查完成了这件事：`cancel()` 在睡眠中途落下的那一刻 `Task.sleep` 就抛出了，而 `checkCancellation()` 守在每次循环的顶部。把*两处*检查都改成注释，那么无论你何时取消，循环都会把二十批全部磨完：证明取消是一个请求，而不是一道命令。\n\n* callout(试一试): 把取消延迟从 `800` 改成 `200`。在它停下之前会磨多少批？\n\n[上一页](@previous)  |  第 7 / 11 页  |  [下一页: 优雅地取消](@next)";
