有没有办法使用 Microsoft.AspNetCore.NodeServices 在 Node.js 上停止执行脚本?

Is there a way to stop a script execution on Node.js using Microsoft.AspNetCore.NodeServices?

我正在尝试在节点服务器上执行一些 javascript,使用 Microsoft.AspNetCore.NodeServices,代码如下:

JObject result = null;
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var scriptTimeout = 2000;

tokenSource.CancelAfter((int) scriptTimeout);

result = await _nodeServices.InvokeExportAsync<JObject>(token, "./Node/script", "run");

InvokeExportAsync 实际上提供了一个成功终止任务的 CancellationToken 参数,但节点进程一直消耗 CPU 直到脚本完成。

例如,如果我尝试 运行 一个需要 10m 才能完成的脚本并且取消令牌在 5m 时将其杀死,我可以看到脚本执行和消耗的时间超过 5m CPU任务管理器。

您永远不应该在某些任务被取消时尝试终止节点进程。

InvokeAsync<T>(CancellationToken cancellationToken, string moduleName, params object[] args)中的CancellationToken参数不是用来终止Node.js进程,而是用来取消调用那些的.NET代码用 Node.js .

编写的脚本

假设 Node.js 中有 3 个异步任务 运行:

setTimeout(resolve, 100, 100); // task 1
setTimeout(resolve, 200, 100); // task 2
setTimeout(resolve, 300, 100); // task 3

现在我们要取消第2个任务,因为INodeServices是一个单例服务,而JavaScript是单线程运行的,如果我们选择终止node.js进程,任务1 和任务 2 也会失败。

其次,.NET不知道当任务达到超时限制时在Node.js中应该做什么。假设您在 Node.js 中请求了一些资源,您将在任务完成后释放这些资源。现在你正在使用 .NET 取消任务,那么 Node.js 中分配的资源呢?

我建议您将 Node.js 代码包装到一个可自动取消的任务中。因为 JavaScript 还没有可取消的承诺,您可以使用第 3 方库或自定义您自己的插件。