You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Boost.Asio中如何多次调用async_write并从按钮事件向服务器发数据?

Boost.Beast异步WebSocket客户端多次发送失效问题解决

问题根源

核心问题出在io_context.run()的阻塞特性上:

  • 如果在UI主线程直接调用ioc.run(),会阻塞整个UI线程,导致按钮点击事件无法被处理,后续触发的do_send请求根本无法执行。
  • 第一次发送完成后,若没有待处理的异步任务,io_context会进入空闲状态并退出run(),此时再调用do_send,异步写操作因为没有io_context的调度而无法执行。

解决方案

无需修改do_send和on_send函数,只要调整io_context的运行方式即可:

  1. 给io_context单独开线程运行
    把ioc.run()放在独立的工作线程中执行,避免阻塞UI线程,保证按钮点击事件能正常响应,示例代码:
    std::thread([&ioc](){ ioc.run(); }).detach();
    // 或保存线程对象在程序退出时join,避免资源泄漏
    
  2. 用io_context::work维持io_context活跃
    创建work对象可以让io_context即使没有待处理的异步任务也保持运行状态,确保后续调用do_send时,异步操作能被正常调度:
    boost::asio::io_context::work keep_alive(ioc);
    
  3. 按钮点击回调直接调用do_send
    只要io_context在独立线程运行且保持活跃,按钮点击事件中直接调用session的do_send方法即可,异步写操作会被io_context正确调度执行。

内容的提问来源于stack exchange,提问作者LPi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 09:39:56