如何强制保持一个Node.js进程终止?

TL; DR

什么是强制保持Node.js进程运行的最佳方式,即保持其事件循环不会空着,从而避免进程终止? 我能想出的最佳解决scheme是:

setInterval(() => {}, Number.POSITIVE_INFINITY);

有没有更好的方法来做到这一点?

问题的长版本

我有一个Node.js脚本使用Edge.js来注册一个callback函数,以便它可以从.NET中的DLL中调用。 这个function将被称为每秒1次,发送一个简单的序列号,应该打印到控制台。

Edge.js部分很好,一切正常。 我唯一的问题是,我的Node.js进程执行它的脚本,之后,它用完事件处理。 在事件循环为空的情况下,它只是终止,忽略了它应该一直运行以便能够从DLL接收callback的事实。

我的Node.js脚本:

 var edge = require('edge'); var foo = edge.func({ assemblyFile: 'cs.dll', typeName: 'cs.MyClass', methodName: 'Foo' }); // The callback function that will be called from C# code: function callback(sequence) { console.info('Sequence:', sequence); } // Register for a callback: foo({ callback: callback }, true); // My hack to keep the process alive: setInterval(function() {}, 60000); 

我的C#代码(DLL):

 public class MyClass { Func<object, Task<object>> Callback; void Bar() { int sequence = 1; while (true) { Callback(sequence++); Thread.Sleep(1000); } } public async Task<object> Foo(dynamic input) { // Receives the callback function that will be used: Callback = (Func<object, Task<object>>)input.callback; // Starts a new thread that will call back periodically: (new Thread(Bar)).Start(); return new object { }; } } 

唯一能解决的办法是注册一个长时间间隔的定时器来调用一个空函数,以保持调度器的繁忙,并避免事件循环为空,这样进程就会一直运行。

有什么办法比我做得更好? 也就是说,保持stream程不需要使用这种“黑客”?

使用“旧”Streams模式来监听永远不会来的标准input:

 // Start reading from stdin so we don't exit. process.stdin.resume(); 

虽然看起来这个问题没有正确的答案,但到目前为止,我们有三种可能的黑客行为,而且我诚实地认为我的方法是不那么干扰的方法:

 setInterval(() => {}, Number.POSITIVE_INFINITY); 

这将设置一个永远不会开火的时间间隔。 有趣的是, setTimeout()不起作用,如果给定Number.POSITIVE_INFINITY作为其超时参数,将不会计划。

作为参考,以下是迄今给出的另外两个答案:

乔:

 require('net').createServer().listen(); 

就像他所说的那样,将创build一个“假听者”。 一个小缺点是我们会为此分配一个端口。

雅各布:

 process.stdin.resume(); 

或者相当于:

 process.stdin.on("data", () => {}); 

stdin置于“旧”模式,为了与在Node.js v0.10( 引用 )之前编写的脚本兼容,Node.js中仍存在一个不build议使用的function。 虽然它确实有效,但是如果您需要使用stdin数据,可能并不理想。