Skip to Content

取消与超时(Cancellation)

取消不产生错误,走协商语义:函数声明自己可取消,被取消时由体内普通 return 返回一个值,任务正常完成。

cancellable 函数

import Async.*; cancellable async func Work() -> int { await 5s; if cancel.requested { return -1; } return 42; }

cancellable 修饰后,函数体内有了 cancel.requested与 cancel.token。

cancel 与 timeout

async func main() -> int { val cts = new CancellationTokenSource(); val t = Work() cancel cts.Token; cts.Cancel(); print(await t); print(await Work() timeout 100ms); return 0; }
-1 -1

task 值挂 timeout

spawn 结果存变量后仍可设死线,语法就是 timeout 后缀:

val t = spawn { await 5s; return 99; }; val t2 = t timeout 500ms; print(await t2);
0

到 timeout 死线,底层任务被终态化为取消:并没有产出并行的新任务,是被修饰的那个 task 本身终态化了,await t2 会拿类型缺省值继续走。

组合器

async func Quick() -> int { await 20ms; return 9; } val both = await all([Quick(), Quick()]); print(both); val first = await any([Quick(), Quick()]); print(first);
[9, 9] 9
  • all:全部完成才完成,返回 list<T>。首个失败短路 fault,进程随之带错退出,其余任务不再继续执行。
  • any:首个终态决定结果,返回 T。其余任务不被取消,继续跑完:any 返回后如果还在推进时钟,未胜出的任务会照常执行完,要停得自己取消。
  • allSettled:等全部终态,返回列表按输入序排列(不按完成序),不短路。

操作数收 list<task<T>> 或 task<T>[]。也可以直接这样写:await all([A() cancel ct, B() cancel ct]),取消后各自返回协商值。

令牌族

令牌类型在 std::Async 模块:CancellationTokenSource 有 Cancel()、CancelAfter(d)、Token 属性,CancellationToken 结构体有 IsCancellationRequested、CanBeCanceled、静态 None()。

注意

  • spawn 也有取消形:spawn cancel ct { } 的块体是匿名 cancellable 环境,体内可用 cancel.*。
  • 嵌套 lambda / 普通嵌套函数体里看不到 cancel.*,体内也不可遮蔽 cancel 名。
最后更新于 2026年10月10日