【发布时间】:2026-02-18 04:15:01
【问题描述】:
TL;DR
强制保持 Node.js 进程运行的最佳方法是什么,即防止其事件循环运行为空,从而防止进程终止?我能想到的最佳解决方案是:
const SOME_HUGE_INTERVAL = 1 << 30;
setInterval(() => {}, SOME_HUGE_INTERVAL);
如果您将间隔时间保持足够长,这将保持间隔运行而不会造成太多干扰。
有没有更好的方法?
问题的长版
我有一个 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);
我的 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”?
【问题讨论】:
-
您可以在节点端的套接字上启动一个虚假侦听器以保持您的进程处于活动状态。
-
JXcore(一个 node.js 发行版)有 process.keepAlive 和 process.release 。您可以先调用 process.keepAlive(),然后在需要关闭应用程序时调用 process.release()。
-
谢谢,@NurayAltin。我现在不打算迁移到 JXCore,但很高兴知道它有一个 API 可以做到这一点。
-
除非我弄错了,否则您正在寻找
Number.POSITIVE_INFINITY或只是Infinity全局。我不相信全局Math对象中有POSITIVE_INFINITY属性。 -
你是对的,@richremer。刚刚修好了,谢谢。