【发布时间】:2021-03-04 10:47:26
【问题描述】:
下面的代码会立即打印“已连接”到控制台,而不是 10 秒后。为什么是这样?这与我传递print 回调的方式有关吗?
void print(const boost::system::error_code& e) {
std::cout << "connected!" << std::endl;
}
class WebSocketSession {
public:
WebSocketSession(asio::io_context &io_context) : io_context_(io_context) {}
void connect() {
boost::asio::deadline_timer
timer(io_context_, boost::posix_time::seconds(10));
timer.async_wait(&print);
}
private:
asio::io_context &io_context_;
};
class WebSocketClient {
public:
WebSocketClient(asio::io_context &io_context) : io_context_(io_context) {}
std::unique_ptr<WebSocketSession> exec() {
auto session = std::make_unique<WebSocketSession>(io_context_);
session->connect();
return session;
}
private:
asio::io_context &io_context_;
};
int main() {
asio::io_context io_context;
WebSocketClient client{io_context};
std::unique_ptr<WebSocketSession> session = client.exec();
io_context.run();
return 0;
}
【问题讨论】:
-
deadline_timer不能是局部变量,因为async_wait立即返回,所以定时器在函数作用域结束时被销毁。 -
谢谢,这很有道理。我还是不明白为什么在销毁定时器的情况下调用回调?
-
回调被调用来通知你发生了一些错误。查看deadline_timer dtor的参考。
-
啊,我明白了。非常感谢您的帮助
标签: c++ boost boost-asio