首页 > 解决方案 > Electron:主进程和渲染器进程之间的竞争条件

问题描述

在我的 Electron 应用程序中,我看到了奇怪的行为。在 Windows 中,有时渲染器进程会在 Electron 的初始化完成之前执行,这会导致启动时出现问题。例如:我在 Main.ts 文件的构造函数中设置了一个 sequelize 数据库并注册 IPC 通道,因此据我所知,app.on('ready') 事件应该在构造函数完成执行后触发,但有时在 Windows 操作系统中只是,即使在数据库设置之前,就绪事件也会触发,并且我的渲染器进程正在调用数据库以获取 MainWindow 的默认记录。

我认为这是渲染器进程和主进程执行之间的竞争条件,有谁知道如何解决这个问题?

Main.ts

export class Main {
    private mainWindow: BrowserWindow;
    static instance: Main;
    public async init(ipcChannels: IpcChannelInterface[]) {
        Main.instance = this;

        // Registering the IPC Channels
        await this.registerIpcChannels(ipcChannels);

        var config = require('../../package.json');
        app.setAsDefaultProtocolClient(config.build.protocols.name);
        app.setAppUserModelId(config.build.appId);
        app.on('ready', Main.createWindow);
        app.on('window-all-closed', Main.onWindowAllClosed);
        app.on('activate', Main.onActivate);

        //Below statement setup the database
        await SequelizeDB.setup();

    }
}

(new Main()).init([new IpcChannel1(), new IpcChannel2()]);

标签: node.jstypescriptelectronrace-conditionrenderer

解决方案


每当电子设置完成时,该ready事件就会触发。init它与您的构造函数或方法无关。来自文档

发射一次,当 Electron 完成初始化时

听起来您是在说您的createWindow函数依赖于数据库设置函数。在这种情况下,您可以先进行设置:

await SequelizeDB.setup();
await app.whenReady(); // this can replace your on("ready", ...) stuff
Main.createWindow();

推荐阅读