setInterval 使用 Electron 一小时后停止

Che*_*yne 8 electron

希望有人能在这里指出我正确的方向。我的电子应用程序需要每 10 分钟左右执行一次 API 调用。目前,我在渲染器进程中使用 setInterval 循环来执行此操作,该循环每 10 分钟触发一次。

它通常工作得很好,几个小时后似乎就停止了。我有几个进程可以清除并重新启动 setInterval 来尝试解决该问题,但似乎没有任何效果。

该应用程序会打开新的浏览器窗口并显示内容,这意味着主窗口可能不会一直处于焦点状态,我怀疑这可能与此有关。

我尝试过添加

powerSaveBlocker.start("prevent-display-sleep");
powerSaveBlocker.start("prevent-app-suspension");
Run Code Online (Sandbox Code Playgroud)

到我的主要电子js脚本,但它似乎没有效果。该问题主要出现在 Windows 机器上。我不完全确定它是否发生在 Mac 或 Linux 上。

所以我的问题是,是否有任何原因会发生这种情况,即间隔在某个点之后就消失了?powerSaveBlocker 调用对我来说很有意义,但它们似乎并没有真正执行任何操作。

或者是否有更好的方法让后台进程定期运行来执行这些 API 调用?我看过,node-schedule但不确定是否能解决这个问题。

Che*_*yne 12

在这里回答我自己的问题,感谢@snwflk,他在对原始帖子的评论中为我指出了正确的方向。

虽然我无法绝对肯定地澄清这可以解决问题,但从那以后我也没有看到这个问题。(它并不总是 100% 可重现,并且很难测试,因为它需要一台机器,单独放置几个小时,这可能会或可能不会显示问题)。

然而,我已经向一些客户推出了修复程序,几天后他们的机器似乎仍然在线,这是一个好兆头。

因此,解决方案是禁用backgroundThrottlingBrowserWindow对象(间隔在渲染器进程中运行)

文档:https :// Electronjs.org/docs/api/browser-window#new-browserwindowoptions

一个例子

mainWindow = new BrowserWindow({
    webPreferences: {
        backgroundThrottling: false,
    },
});
Run Code Online (Sandbox Code Playgroud)

仅供参考,有一些错误导致此设置无法工作,即https://github.com/electron/ Electron/issues/20974,因此请务必更新您的电子版本。