当前位置: 首页 > news >正文

electron中IPC 渲染进程与主进程通信方法解析

electron中ipcRenderer.invoke、ipcRenderer.on、ipcRenderer.send、ipcRenderer.sendSync作用与区别

IPC 渲染进程与主进程通信方法解析

ipcRenderer 的这几个方法作用不完全相同,它们适用于不同的通信场景,核心区别在于通信方向是否需要响应以及同步 / 异步特性。下面详细说明:

1. ipcRenderer.send(channel, ...args)

  • 作用:从渲染进程主进程发送异步消息(单向通信),不需要返回结果。

  • 特点

    • 发送后立即返回,不等待主进程处理。

    • 主进程通过 ipcMain.on(channel, (event, ...args) => { ... }) 接收。

    • 适合只需要通知主进程执行操作,不需要结果的场景。

  • 示例

// 渲染进程ipcRenderer.send('open-file', '/path/to/file');// 主进程ipcMain.on('open-file', (event, path) => {fs.openSync(path, 'r');});

2. ipcRenderer.on(channel, listener)

  • 作用:在渲染进程中监听主进程发送的特定频道消息(被动接收)。

  • 特点

    • 用于接收主进程通过 webContents.send(channel, ...args) 发送的消息。

    • 是 “接收消息” 的方法,而非 “发送消息”。

  • 示例

// 渲染进程(监听主进程消息)ipcRenderer.on('file-opened', (event, content) => {console.log('文件内容:', content);});// 主进程(发送消息给渲染进程)mainWindow.webContents.send('file-opened', '文件内容...');

3. ipcRenderer.invoke(channel, ...args)

  • 作用:从渲染进程主进程发送异步请求,并等待主进程返回结果(类似 HTTP 的请求 - 响应模式)。

  • 特点

    • 返回一个 Promise,可配合 async/await 使用。

    • 主进程通过 ipcMain.handle(channel, async (event, ...args) => { ... }) 处理并返回结果。

    • 适合需要主进程处理后返回数据的场景(如读取文件、调用系统 API 等)。

  • 示例

// 渲染进程async function readFile() {const content = await ipcRenderer.invoke('read-file', '/path/to/file');
console.log('文件内容:', content);}// 主进程ipcMain.handle('read-file', async (event, path) => {return fs.readFileSync(path, 'utf8'); // 返回结果给渲染进程});

4. ipcRenderer.sendSync(channel, ...args)

  • 作用:从渲染进程主进程发送同步请求,会阻塞渲染进程直到主进程返回结果。

  • 特点

    • 同步执行,会卡住渲染进程(可能导致界面卡顿),不推荐频繁使用

    • 主进程通过 ipcMain.on(channel, (event, ...args) => { event.returnValue = ... }) 返回结果。

    • 适合极少数必须同步获取结果的场景。

  • 示例

// 渲染进程(同步等待结果)const content = ipcRenderer.sendSync('read-file-sync', '/path/to/file');console.log('文件内容:', content);// 主进程ipcMain.on('read-file-sync', (event, path) => {event.returnValue = fs.readFileSync(path, 'utf8'); // 通过 returnValue 返回});

核心区别总结

方法通信方向同步 / 异步是否需要返回结果主进程处理方式
send渲染 → 主进程异步不需要ipcMain.on
on主进程 → 渲染异步接收结果配合 webContents.send
invoke渲染 → 主进程异步需要(请求 - 响应)ipcMain.handle
sendSync渲染 → 主进程同步需要(阻塞)ipcMain.on + event.returnValue

最佳实践

  • 大多数场景优先使用 invoke(异步请求 - 响应)和 send(单向通知)。

  • 避免使用 sendSync,因其会阻塞渲染进程,影响用户体验。

  • 主进程向渲染进程发送消息时,用 webContents.send 配合渲染进程的 ipcRenderer.on

http://www.dtcms.com/a/298449.html

相关文章:

  • 常用设计模式系列(十二)—享元模式
  • 如何在 FastAPI 中玩转 GraphQL 和 WebSocket 的实时数据推送魔法?
  • C++中使用Essentia实现STFT/ISTFT
  • git 连接GitHub仓库
  • 强化学习之策略熵坍塌优化-clip conv kv conv
  • 若依搭建详解
  • Android Paging 分页加载库详解与实践
  • 第七章 愿景11 琦琦复盘测试
  • Keepalived 深度技术解析与高可用实践指南
  • C++编程学习(第15天)
  • ServletRegistrationBean相关知识点
  • 用 Docker 一键部署 Flask + Redis 微服务
  • NX848NX854美光固态闪存NX861NX864
  • 截稿倒计时 TrustCom‘25大会即将召开
  • C++中AC、WA、RE、CE、TLE、MLE、PE、OLE的意思
  • 【ResNet50图像分类部署至RK3588】模型训练→转换RKNN→开发板部署
  • 安装本地python文件到site-packages
  • 专题:2025电商增长新势力洞察报告:区域裂变、平台垄断与银发平权|附260+报告PDF、原数据表汇总下载
  • Linux运维新人自用笔记(Rsync远程传输备份,服务端、邮箱和客户端配置、脚本)
  • 【c++思维题】洛谷 P1496 火烧赤壁
  • 【js(8) for...in和for...of】
  • NVM踩坑实录:配置了npm的阿里云cdn之后,下载nodejs老版本(如:12.18.4)时,报404异常,下载失败的问题解决
  • LeetCode|Day25|389. 找不同|Python刷题笔记
  • IOPaint 图像修复工具,学习笔记
  • clFlush和clFinish的区别 (来自deepseek)
  • ZYNQ芯片,SPI驱动开发自学全解析个人笔记【FPGA】【赛灵思
  • 电子电气架构 --- 车载软件与样件产品交付的方法
  • 【HarmonyOS】鸿蒙应用开发中常用的三方库介绍和使用示例
  • QT6 源,七章对话框与多窗体(14)栈式窗体 QStackedWidget:本类里代码很少。举例,以及源代码带注释。
  • 浅谈业务时序数据异常检测