如何强制阻止Node.js进程终止?

Luc*_*iva 39 node.js edge.js

TL; DR

强制保持Node.js进程运行的最佳方法是什么,即保持其事件循环不运行,从而阻止进程终止?我能想出的最佳解决方案是:

const SOME_HUGE_INTERVAL = 1 << 30;
setInterval(() => {}, SOME_HUGE_INTERVAL);
Run Code Online (Sandbox Code Playgroud)

如果您将间隔时间保持足够长的话,这将保持间隔运行而不会引起太多干扰.

有没有更好的方法呢?

长版的问题

我有一个Node.js脚本使用Edge.js注册一个回调函数,以便可以从.NET内的DLL内部调用它.此功能将每秒调用1次,发送一个应打印到控制台的简单序列号.

Edge.js部分很好,一切正常.我唯一的问题是我的Node.js进程执行它的脚本,然后它用完了要处理的事件.它的事件循环为空,它只是终止,忽略了它应该继续运行以便能够从DLL接收回调的事实.

我的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);
Run Code Online (Sandbox Code Playgroud)

我的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 { };
    }
}
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一解决方案是注册一个具有较长间隔的计时器来调用空函数,以保持调度程序繁忙并避免使事件循环变空,以便进程永远运行.

有没有办法比我更好地做到这一点?即,保持流程运行不必使用这种"黑客"?

Jac*_*all 31

使用"旧"Streams模式来监听永远不会出现的标准输入:

// Start reading from stdin so we don't exit.
process.stdin.resume();
Run Code Online (Sandbox Code Playgroud)


Luc*_*iva 19

虽然看起来这个问题没有正确答案,但到目前为止我们有3个可能的黑客攻击,老实说我认为我的方法不那么具有侵入性:

setInterval(() => {}, 1 << 30);
Run Code Online (Sandbox Code Playgroud)

这将设置一个间隔,大约每12天触发一次.

最初,我的黑客Number.POSITIVE_INFINITY作为句点传递,所以计时器实际上永远不会触发,但是这种行为最近发生了变化,现在API不接受大于2147483647的任何内容(即,2 ** 31 - 1).请参阅此处此处的文档.

作为参考,这是目前给出的另外两个答案:

乔:

require('net').createServer().listen();
Run Code Online (Sandbox Code Playgroud)

他会称之为创造一个"虚假的倾听者".一个小的缺点是我们只为此分配一个端口.

雅各布:

process.stdin.resume();
Run Code Online (Sandbox Code Playgroud)

或等效的:

process.stdin.on("data", () => {});
Run Code Online (Sandbox Code Playgroud)

stdin成"旧"模式中,不建议使用的功能,仍然存在于Node.js的用于与Node.js的v0.10(之前编写的脚本兼容性参考).