如何解决Boost awaitable:如何在帖子内等待异步操作
我正在编写一些 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
而不是回调来发布。这将使您的功能等待。然后,您就可以将异步调用直接放在您的函数中:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。