asio 不做任何延迟的原因是什么?
What is the reason asio doesn't do any delay?
我是 asio 的新手。
这是我在编写白天 tcp-server 时遵循的指南:https://think-async.com/Asio/asio-1.18.1/doc/asio/tutorial/tutdaytime3.html。我试图重现一个合理的示例,该示例将表明非同步代码实际上是异步的。我没有修改其他任何东西,只是 tcp_server
class 中的一小段代码。我添加这个延迟是为了看到在我们等待计时器到期后,我们可以优雅地处理其他客户端 connections/requests。那么,我错过了什么吗?因为在我的情况下,延迟基本上不起作用;(
void handle_accept(const tcp_connection::pointer &new_connection,
const asio::error_code &error) {
asio::steady_timer timer(io_context_, asio::chrono::seconds(5));
std::cout << "Before timer" << std::endl;
timer.async_wait(std::bind(&tcp_server::handle_wait, this, error, new_connection));
}
void handle_wait(asio::error_code &ec, const tcp_connection::pointer &new_connection) {
if (!ec) {
new_connection->start();
}
std::cout << "Inside timer" << std::endl;
start_accept();
}
void handle_accept(const tcp_connection::pointer &new_connection,
const asio::error_code &error) {
asio::steady_timer timer(io_context_, asio::chrono::seconds(5));
std::cout << "Before timer" << std::endl;
timer.async_wait(std::bind(&tcp_server::handle_wait, this, error, new_connection));
}
timer
是局部变量。
async_wait
returns 立即,无阻塞。
函数退出,破坏timer
。 timer
取消所有挂起的操作(使用 error::operation_aborted
)。
确保计时器的生命周期足够长以允许它过期(或至少直到它不再相关)。 在您的情况下,您的 class 中可能已经有一个 tcp::acceptor
成员,并且计时器可能位于它旁边 。
我是 asio 的新手。
这是我在编写白天 tcp-server 时遵循的指南:https://think-async.com/Asio/asio-1.18.1/doc/asio/tutorial/tutdaytime3.html。我试图重现一个合理的示例,该示例将表明非同步代码实际上是异步的。我没有修改其他任何东西,只是 tcp_server
class 中的一小段代码。我添加这个延迟是为了看到在我们等待计时器到期后,我们可以优雅地处理其他客户端 connections/requests。那么,我错过了什么吗?因为在我的情况下,延迟基本上不起作用;(
void handle_accept(const tcp_connection::pointer &new_connection,
const asio::error_code &error) {
asio::steady_timer timer(io_context_, asio::chrono::seconds(5));
std::cout << "Before timer" << std::endl;
timer.async_wait(std::bind(&tcp_server::handle_wait, this, error, new_connection));
}
void handle_wait(asio::error_code &ec, const tcp_connection::pointer &new_connection) {
if (!ec) {
new_connection->start();
}
std::cout << "Inside timer" << std::endl;
start_accept();
}
void handle_accept(const tcp_connection::pointer &new_connection,
const asio::error_code &error) {
asio::steady_timer timer(io_context_, asio::chrono::seconds(5));
std::cout << "Before timer" << std::endl;
timer.async_wait(std::bind(&tcp_server::handle_wait, this, error, new_connection));
}
timer
是局部变量。
async_wait
returns 立即,无阻塞。
函数退出,破坏timer
。 timer
取消所有挂起的操作(使用 error::operation_aborted
)。
确保计时器的生命周期足够长以允许它过期(或至少直到它不再相关)。 在您的情况下,您的 class 中可能已经有一个 tcp::acceptor
成员,并且计时器可能位于它旁边 。