如何使用Boost.Asio正确实现async / await语法

时间:2018-03-18 22:06:48

标签: c++ boost-asio

我尝试使用Boost.Asio实现一些网络应用程序。我有多层回调问题。在本机支持async/await语法的其他语言中,我可以像这样编写我的逻辑

void do_send(args...) {
  if (!endpoint_resolved) {
    await resolve_async(...);  // results are stored in member variables
  }
  if (!connected) {
    await connect_async(...);
  }
  await send_async(...);
  await receive_async(...);
}

现在我必须使用多层回调来编写它

void do_send(args...) {
  if (!endpoint_resolved) {
    resolve_async(..., [captures...](args...) {
      if (!connected) {
        connect_async(..., [captures...](args...) {
          send_async(..., [captures...](args...) {
            receive_async(..., [captures...](args...) {
              // do something
            });  // receive_async
          });  // send_async
        });  // connect_async
      }
    });
  }
}

这很麻烦且容易出错。另一种方法是使用std::bind将成员函数绑定为回调,但这并不能解决问题,因为我必须在回调中编写复杂的逻辑来确定下一步该做什么。

我想知道是否有更好的解决方案。 理想情况下,我希望以同步方式编写代码,而我可以在任何I / O操作上异步await

我还检查了std::asyncstd::future等。但他们似乎并不适合我的情况。

1 个答案:

答案 0 :(得分:2)

Boost.Asio' s stackful coroutines将提供一个很好的解决方案。堆栈协程允许以读取同步的方式写入异步代码。可以通过spawn函数创建一个堆栈协程。在协程中,将row, sess作为处理程序传递给异步操作将启动操作并暂停协程。异步操作完成后,协程将自动恢复。以下是文档中的示例:

yield_context