TL; DR
什麼是強制保持Node.js進程運行的最佳方式,即保持其事件循環不會空着,從而避免進程終止?我可以拿出最好的解決辦法是這樣的:如何強制保持Node.js進程終止?
setInterval(() => {}, Number.POSITIVE_INFINITY);
有沒有更好的辦法做到這一點?
問題
的長版我有使用Edge.js註冊一個回調函數,以便它可以在.NET中的DLL中被稱爲Node.js的腳本。這個功能將被稱爲每秒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 { };
}
}
唯一的解決辦法我能想出用一個較長的時間來註冊一個計時器調用一個空函數只是爲了保持調度器繁忙,並避免讓事件循環爲空,以便該過程保持永久運行。
有什麼辦法比我做得更好嗎?也就是說,保持進程運行而不需要必須使用這種「黑客」?
您可以在節點端的套接字上啓動一個假偵聽器,以使您的進程保持活動狀態。 – Joe
JXcore(node.js distro)有process.keepAlive和process.release。您可以在其他任何事情之前調用process.keepAlive(),並在應用程序需要關閉時最後調用process.release()。 –
謝謝,@NurayAltin。我現在不打算遷移到JXCore,但很高興知道它有一個API來執行此操作。 –