我正在尝试使用 Microsoft.AspNetCore.NodeServices 在 Node 服务器上执行一些 javascript,代码如下:
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 参数,可以成功终止任务,但 Node 进程会继续消耗 CPU,直到脚本完成。
例如,如果我尝试运行一个需要 10m 才能完成的脚本,并且取消 token 在 5m 上终止它,我可以看到脚本在任务管理器上执行并消耗 CPU 时间超过 5m。
最佳答案
当某些任务被取消时,您不应该尝试终止 Node 进程。
CancellationToken
InvokeAsync<T>(CancellationToken cancellationToken, string moduleName, params object[] args)
中的参数不用于终止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
现在我们要取消第二个任务,因为 INodeServices
是一个单例服务,而JavaScript是单线程运行的,如果我们选择终止node.js进程,任务1和任务2也会失败。
其次,.NET
不知道 Node.js
应该做什么当任务达到超时限制时。假设您在 Node.js
中请求了一些资源,任务完成后您将释放资源。现在您正在使用 .NET
取消任务,Node.js
中分配的资源呢? ?
我建议你应该包裹你的 Node.js
代码写入可自动取消的任务。由于 JavaScript 尚无可取消的 promise ,因此您可以使用第 3 方库或自定义您自己的插件。
关于node.js - 有没有办法使用 Microsoft.AspNetCore.NodeServices 停止 Node.js 上的脚本执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52894175/