跳到主要内容

资源释放与取消

扩展宿主是长生命周期进程。注册命令、监听事件、创建状态栏,都会留下回调。扩展重载或关闭时如果不解开,旧回调还会接着跑。

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 发射器。

参考​