有没有办法使用 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 方库或自定义您自己的插件。
我正在尝试在节点服务器上执行一些 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 方库或自定义您自己的插件。