如何解决处理取消 onDidChangeTextDocument
我使用 TypeScript 开发了一个开源 VS Code 扩展。此扩展程序用于分析源代码文件、提取信息(如过程签名)、创建诊断信息等等。
现在我收到了一个关于性能的问题。问题发生在一个有 9000 多行和数千个程序的源代码文件中。分析需要一些时间(大约 4 秒),但这根本不是问题。基本上性能总体上“还可以”。真正的问题发生在源代码修改期间。我已订阅 onDidChangeTextDocument
事件以在后台更新我的数据并更新诊断。每当 VS Code TextDocument
中的某些内容发生更改时,都会触发此事件。
为了避免不必要的处理,我实现了一点超时(1 秒)以确保进程不会在用户仍在打字时启动。不幸的是,这还不够……如果您等待超过一秒钟,分析将开始,当您继续更改文档时,该过程将运行两次或更频繁。
所以我另外开始实现节点包cancellationtoken
,但它似乎不起作用。即使我调用 cancellation.cancel()
,该过程也不会停止。
我的代码如下:
var changeTimeout: NodeJS.Timeout | null;
var cancellation: { cancel: (reason?: any) => void,token: CancellationToken } | null = null;
workspace.onDidChangeTextDocument((event: TextDocumentChangeEvent) => {
if ((!event.document) || (event.document.languageId !== 'al')) {
return;
}
// clear timer to prevent from execution while typing
if (changeTimeout !== null) {
clearTimeout(changeTimeout);
}
// send cancellation request if processing has already been started
if (cancellation !== null) {
cancellation.cancel();
}
changeTimeout = setInterval(function() {
if (changeTimeout !== null) {
clearTimeout(changeTimeout);
}
changeTimeout = null;
// create new cancellation token
cancellation = CancellationToken.create();
let obj = MyClass.MyProcessingFunction(event.document,cancellation.token);
// do something with 'obj'
},1000);
},this,subscriptions);
在 MyProcessingFunction
中,我实现了一个函数来测试是否已发送取消:
private static TokenIsCancelled(token: CancellationToken|null): boolean {
if (token === null) {
return false;
}
console.debug(`Cancellation: ${token.isCancelled}`);
return token.isCancelled;
}
public static MyProcessingFunction(document: TextDocument,token: CancellationToken|null = null) {
// some prevIoUs code
[..]
if (this.TokenIsCancelled(token)) {
return null;
}
[..]
// some other code following ...
}
我希望我可以简单地检查 token
但看起来我做错了什么!?有人可以帮我解决这个问题吗?预先非常感谢您。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。