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

标签 node.js edge.js

TL;DR

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

const SOME_HUGE_INTERVAL = 1 << 30;
setInterval(() => {}, SOME_HUGE_INTERVAL);

如果您将间隔时间保持足够长,这将保持间隔运行而不会造成太多干扰。

有没有更好的方法?

问题的长版本

我有一个使用 Edge.js 的 Node.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);

我的 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 { };
    }
}

我能想到的唯一解决方案是注册一个间隔很长的计时器来调用一个空函数,只是为了让调度程序保持忙碌并避免让事件循环为空,以便进程永远运行。

有没有比我做得更好的方法?即,保持进程运行而不不必使用这种“hack”?

最佳答案

最简单、干扰最小的解决方案

老实说,我认为我的方法是侵入性最小的方法:

setInterval(() => {}, 1 << 30);

这将设置一个无害的间隔,大约每 12 天触发一次,实际上什么都不做,但保持进程运行。

Originally, my solution used Number.POSITIVE_INFINITY as the period, so the timer would actually never fire, but this behavior was recently changed by the API and now it doesn't accept anything greater than 2147483647 (i.e., 2 ** 31 - 1). See docs here and here.


对其他解决方案的评论

作为引用,这里是到目前为止给出的另外两个答案:

乔的(从那时起被删除,但完全有效):

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

将创建一个“虚假监听器”,正如他所说。一个小缺点是我们会为此分配一个端口。

雅各的:

process.stdin.resume();

或等价物:

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

stdin 置于“旧”模式,这是 Node.js 中仍然存在的已弃用功能,以便与在 Node.js v0.10 (reference) 之前编写的脚本兼容。

我建议不要这样做。它不仅已被弃用,而且还不必要地与标准输入混淆。

关于node.js - 如何强制阻止 Node.js 进程终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23622051/

相关文章:

node.js - Node.js中的exports.install是什么?

javascript - Node js Express 中的方法未定义错误

c# - 在 edge.js 应用程序中加载 WCF app.config 绑定(bind)

javascript - 如何从 DLL 创建对象并使用 edge.js 调用其方法之一?

c# - Node/边缘 : alternative to node. exe.config

asp.net-mvc - 服务器端使用 Edge.js 在 ASP.NET 中呈现 Angular 2

node.js - 安装 node.js 6.3.1 - 没有这样的文件或目录

node.js - 如何从 Cpanel 中删除我的 NodeJs 应用程序?

javascript - 是否有成功的方法来销毁 Buffer 实例并释放 NodeJS Canvas 中使用的内存?

c# - 在 Node.js/服务器端 javascript 中使用 .NET DLL