我正在尝试使用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参数,但是节点进程一直在消耗CPU,直到脚本结束。
例如,如果我尝试运行一个需要10m来完成的脚本,而取消令牌在5m上杀死了它,我可以看到在任务管理器上执行和消耗CPU的脚本超过了5m。
发布于 2018-10-22 13:28:39
当某些任务被取消时,您永远不应该尝试终止节点进程。
InvokeAsync<T>(CancellationToken cancellationToken, string moduleName, params object[] args)中的CancellationToken参数不用于终止Node.js进程,而是用于取消调用用 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还没有可取消的承诺,你可以使用第三方库或者自定义你自己的插件。
https://stackoverflow.com/questions/52894175
复制相似问题