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
我正在编写一些 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