Skip to content

Edge 合集 23 · 异步任务与工作线程:不卡界面的批量取数 ​

《LingBuilder Edge 浏览器合集》第 23 集(高级篇)。前面各集你已经用过很多「异步命令 + 完成处理器」;这一集把任务族 6 条补齐——拿到任务 ID 之后还能查状态、取消、释放,配合页面侧的 Promise 就能做「可取消的批量取数」。同时介绍工作线程族 6 条:查看页面背后的 Service Worker / Shared Worker。全程约 25 分钟。

前置要求:学过第 5 集(异步命令)。本集源码包见文末。

这一集你将学会 ​

  • 任务生命周期:发起(返回任务ID)→ 完成(处理器)→ 取状态/取结果 → 取消/释放
  • 页面侧 new Promise 制造可感知的异步任务
  • 状态码速记:0 等待 / 1 成功 / 2 失败 / 3 已取消 / 4 已超时
  • 工作线程族:枚举异步 + 取信息JSON + 发送消息

1. 任务族 6 条地图 ​

命令作用
EdgeView任务_取当前任务ID()完成处理器内取得正在消费的任务 ID
EdgeView任务_取状态(任务ID)0 等待 / 1 成功 / 2 失败 / 3 已取消 / 4 已超时
EdgeView任务_取结果(任务ID)UTF-16 文本或 JSON 结果
EdgeView任务_取错误(任务ID)中文错误 + HRESULT
EdgeView任务_取消(任务ID)取消尚未完成的任务
EdgeView任务_释放(任务ID)释放句柄(不再复用)

2. 新建项目与启用模块 ​

欢迎页「新建项目」,项目名称 异步任务台,「Windows 界面设计」:

新建项目

模块确认三个已启用:EdgeView 浏览器模块、文本处理模块、Win32窗口基础模块:

启用模块

3. 设计界面 ​

控件名称显示内容左距顶距宽度高度
按钮发任务按钮发一个异步任务201416032
按钮查状态按钮查任务状态1921414032
按钮取消按钮取消任务3441412032
按钮释放按钮释放任务4761412032
Edge浏览器浏览器1(拖入)2060920470
标签日志标题任务日志2054212020
列表框日志列表(清空)2056692096
标签状态标签就绪。任务ID 是异步命令的「取货凭证」2066492020

设计器全景

4. 写代码 ​

4.1 类级变量 + 发起任务 ​

lcpp
长整数型 当前任务 = 0

事件 _发任务按钮_被单击()
    EdgeView脚本_执行异步(浏览器1, "new Promise(function(r){setTimeout(function(){r('任务干完了');}, 3000);})", &任务完成)
    控件_插入项目(日志列表, 0, "已发起 3 秒延时任务(页面侧 Promise)")
结束

事件 任务完成()
    当前任务 = EdgeView任务_取当前任务ID()
    控件_插入项目(日志列表, 0, "任务完成:状态 " + 到文本(EdgeView任务_取状态(当前任务)) + ",结果 " + EdgeView任务_取结果(当前任务))
结束

页面侧的 new Promise 3 秒后才 resolve——这就是一个可感知的异步任务。完成处理器里第一件事是取当前任务 ID 存进类级变量,后面的查/取消/释放都靠它。

代码-发任务

4.2 查状态、取消、释放 ​

lcpp
事件 _查状态按钮_被单击()
    如果 (当前任务 = 0)
        控件_设置文本(状态标签, "还没有任务记录")
        返回()
    如果结束
    控件_插入项目(日志列表, 0, "任务 " + 到文本(当前任务) + " 状态:" + 到文本(EdgeView任务_取状态(当前任务)) + "(0等待/1成功/2失败/3取消/4超时)")
结束

事件 _取消按钮_被单击()
    EdgeView任务_取消(当前任务)
    控件_插入项目(日志列表, 0, "已请求取消任务 " + 到文本(当前任务))
结束

事件 _释放按钮_被单击()
    EdgeView任务_释放(当前任务)
    控件_插入项目(日志列表, 0, "已释放任务 " + 到文本(当前任务) + "(句柄不再复用)")
    当前任务 = 0
结束

取消 只对「等待中」的任务有效(已完成任务的取消是空操作);释放 后句柄不再复用——把类级变量清 0 是好习惯。

代码-查取消释放

5. 编译:先看错误列表 ​

错误列表 (0),输出窗口「生成完成」:

错误列表零报错

6. 运行:看着任务走完一生 ​

点「运行」:

运行-打开

6.1 发任务、查状态、等完成 ​

点「发一个异步任务」→ 立刻「查任务状态」(状态 0 等待)→ 3 秒后完成处理器自动记账(状态 1 成功):

运行-任务完成

6.2 释放 ​

点「释放任务」——句柄退役:

运行-释放任务

常见问题急救表 ​

症状原因解法
取状态一直是 0任务确实还没完成等 完成处理器 触发再查
取结果拿到 {}任务无返回值(页面 Promise resolve 空值)Promise 里 return 内容
取消没生效任务已完成取消只对等待中任务有效
释放后再用句柄崩溃/异常释放后句柄不复用释放后把类级变量清 0
编译报「未知的命令 EdgeView任务_取当前任务ID」该命令是 advanced模块生态勾选「显示底层高级 API」再确认

本集小结 ​

  • 任务 ID 是异步命令的取货凭证;完成处理器里用 取当前任务ID() 领取。
  • 生命周期:发起 → 等待(0) → 成功(1)/失败(2)/取消(3)/超时(4) → 释放。
  • 工作线程族同套路:工作线程_枚举异步 → 取信息JSON → 发送消息(页面须有 SW/SharedWorker)。

源码包 ​

本集完整源码已打包为 异步任务台.lcpppkg(随本教程同目录分发,官网示例源码区可下载)。在 LingBuilder 欢迎页点「打开工作区」,或直接双击 .lcpppkg 文件即可导入运行。

下一集预告:《通知与扩展》——通知族 4 条+扩展族 4 条+对象族 4 条:接管网页通知、加载浏览器扩展。

回合集总览