Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用Boost.Asio正确实现异步/等待语法_C++_Boost Asio - Fatal编程技术网

C++ 如何使用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(

我正在尝试使用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操作上异步等待。

我还检查了
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)
  {
    // ...
  }
}

或者,我会说,创建自定义组合操作作为构建块是可行的,但要设计好却要困难得多