我尝试使用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::async
,std::future
等。但他们似乎并不适合我的情况。
答案 0 :(得分:2)
Boost.Asio' s stackful coroutines将提供一个很好的解决方案。堆栈协程允许以读取同步的方式写入异步代码。可以通过spawn
函数创建一个堆栈协程。在协程中,将row, sess
作为处理程序传递给异步操作将启动操作并暂停协程。异步操作完成后,协程将自动恢复。以下是文档中的示例:
yield_context