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

