首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法使用Microsoft.AspNetCore.NodeServices停止Node.js上的脚本执行?

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

Stack Overflow用户
提问于 2018-10-19 22:14:20
回答 1查看 293关注 0票数 2

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

代码语言: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参数,但是节点进程一直在消耗CPU,直到脚本结束。

例如,如果我尝试运行一个需要10m来完成的脚本,而取消令牌在5m上杀死了它,我可以看到在任务管理器上执行和消耗CPU的脚本超过了5m。

EN

回答 1

Stack Overflow用户

发布于 2018-10-22 13:28:39

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

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

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

代码语言:javascript
复制
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还没有可取消的承诺,你可以使用第三方库或者自定义你自己的插件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52894175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档