资源释放与取消
扩展宿主是长生命周期进程。注册命令、监听事件、创建状态栏,都会留下回调。扩展重载或关闭时如果不解开,旧回调还会接着跑。
Disposable
Disposable 表示「可以释放的东西」。registerCommand、onDidChangeConfiguration、createStatusBarItem 都会返回它。调用 dispose() 后,命令注销、监听卸下、界面控件移除。
ExtensionContext.subscriptions 是一个数组。推进去的对象会在扩展停用时被统一 dispose。这是默认写法:
context.subscriptions.push(
vscode.commands.registerCommand('demo.hello', () => {
// 命令实现
})
);
漏掉的典型后果:重载扩展后同一命令注册两次直接报错;旧的文件监听继续触发;状态栏出现重复项。
多个对象可以放进 vscode.Disposable.from(...),一次释放。
取消
CancellationToken 表示这次请求还可以继续吗。补全、悬停、代码操作的提供器都会收到它。用户又打了一个字,上一轮请求就被取消。
provideCompletionItems(document, position, token) {
if (token.isCancellationRequested) {
return [];
}
// 长时间工作要把 token 继续传给下游请求
}
token.onCancellationRequested 用来打断自己的定时器或 HTTP 请求。已取消的结果不要再写入诊断集合或界面。
CancellationTokenSource 用来创建令牌。自己 dispose 这个 source,否则监听会留下。
事件
Event<T> 是订阅函数:传入监听器,返回 Disposable。EventEmitter 是你自己发事件时用的,fire 通知订阅者,event 交给外部订阅。用完要 dispose 发射器。