C++ 如何使用Boost.Asio正确实现异步/等待语法
我正在尝试使用Boost.Asio实现一些网络应用程序。我遇到了多层回调的问题。在本机支持C++ 如何使用Boost.Asio正确实现异步/等待语法,c++,boost-asio,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(
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操作上异步等待。
我还检查了std::async
,std::future
等,但它们似乎不适合我的情况。Boost。Asio将提供一个很好的解决方案。堆栈式协同路由允许以读取同步的方式编写异步代码。可以通过函数创建一个堆栈式的协同路由。在协同程序中,将yield\u上下文作为处理程序传递给异步操作将启动该操作并挂起协同程序。异步操作完成后,将自动恢复协同路由。以下是文档中的示例:
boost::asio::spawn(my_strand, do_echo);
// ...
void do_echo(boost::asio::yield_context yield)
{
try
{
char data[128];
for (;;)
{
std::size_t length =
my_socket.async_read_some(
boost::asio::buffer(data), yield);
boost::asio::async_write(my_socket,
boost::asio::buffer(data, length), yield);
}
}
catch (std::exception& e)
{
// ...
}
}
或者,我会说,创建自定义组合操作作为构建块是可行的,但要设计好却要困难得多