Boost awaitable:如何等待 post 中的异步操作

Boost awaitable: how to await on async operation inside post

我正在编写一些 asio 代码并尝试重构它以使用 C++20 协程。但是我在转换这段代码时遇到了困难:

asio::post(
    my_strand,
    [self = shared_from_this()]() {
        // functions that write in this container can only be called
        // on a single thread at a time, thus the strand
        session_write_history.push_back(buffer);
        /* co_await? */ socket.write_async(buffer, /* use awaitable? */);
    }
);

你看,我的异步操作是在 post 回调中完成的,所以在异步操作上使用 asio::use_awaitable 会使回调成为协程。有没有办法等待链上 asio::post 内的异步操作?

只需发送 asio::use_awaitable 而不是回调 post。这将使您的功能可等待。然后您就可以将异步调用直接放在您的函数中:

co_await asio::post(my_strand, asio::use_awaitable);
// ...
// code that runs on the strands context
// ...
co_await socket.async_write_some(buffer, asio::use_awaitable);

事实上,您可以在任何放置回调的地方使用 asio::use_awaitable,因此将回调异步代码转换为协同程序几乎可以完成 1:1