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

标签 node.js asp.net-core cancellation

我正在尝试使用 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/

相关文章:

c# - 无法访问 .net 标准中的 httpcontext 扩展方法

c++ - 现实生活中是否存在简单的 bool 指针作为线程取消标志不会有效取消线程的情况?

javascript - 在 MVC 结构中使用 Express + Request Node 模块的异步嵌套回调

javascript - 如何遍历对象中编号的属性?

c# - 多语言 Asp.Net Core 3.1 MVC 应用程序不在 url 中显示语言代码

c# - ASP.NET Core 中的响应类型

http - 如何复制 Context 对象而不派生

javascript - 中止 ecmascript7 异步函数

node.js - 如何从管理部分在 keystone.js 中创建页面

javascript - cordova Zeroconf 如何支持?