我正在尝试使用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。
答案 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库或自定义自己的插件。