有没有一种方法可以使用Microsoft.AspNetCore.NodeServices在Node.js上停止脚本执行?

时间:2018-10-19 14:14:20

标签: 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参数,该参数可以成功终止任务,但是节点进程一直消耗CPU,直到脚本完成。

例如,如果我尝试运行一个需要10m才能完成的脚本,而取消令牌则在5m上将其杀死,那么我可以在任务管理器上看到5m以上的脚本正在执行并消耗CPU。

1 个答案:

答案 0 :(得分:0)

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

CancellationToken中的InvokeAsync<T>(CancellationToken cancellationToken, string moduleName, params object[] args)参数不用于终止Node.js进程,但用于取消调用{ {1}}

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

.NET

现在我们要取消第二个任务,因为Node.js是单例服务,并且JavaScript在单线程中运行,如果我们选择终止node.js进程,则任务1和任务2也将失败。

第二, setTimeout(resolve, 100, 100); // task 1 setTimeout(resolve, 200, 100); // task 2 setTimeout(resolve, 300, 100); // task 3 不知道当任务达到其超时限制时应该在INodeServices中做什么。假设您在.NET中请求了一些资源,并且在任务完成后将释放这些资源。现在,您正在使用Node.js取消任务,Node.js中分配的资源又如何呢?

我建议您将.NET代码包装到自动取消的任务中。由于JavaScript尚无可取消的承诺,因此您可以使用3rd party库或自定义自己的插件。