我正在尝试转换一个boost::asio::http::async_write调用以便将来运行。查看boost上的use_future文档和一些示例,我修改了代码如下:
工作正常的先前代码
auto bytes_transferred =
boost::beast::http::async_write(*d_tcpStream, req, yield[ec]);
std::cout << "Number of Bytes transmitted: " << bytes_transferred;
字符串
将其转换为:
try{
auto write_fut = boost::beast::http::async_write(*d_tcpStream, req, boost::asio::use_future);
if (write_fut.wait_for(std::chrono::seconds(10)) == std::future_status::timeout){
std::cout << "TIMEOUTTT" << std::endl;
return 1;
}else{
auto bytes_tx = write_fut.get();
std::cout << "Number of Bytes transmitted: " << bytes_tx;
}
}
catch (std::system_error& ex)
{
std::cerr << ex.what() << std::endl;
}
型
在检查另一边的服务器时,我没有看到来自我上面的客户端的传入呼叫。我可以看到超时打印一致。客户端在转换为use_future之后似乎并没有完全触发写操作。
1条答案
按热度按时间dtcbnfnu1#
future::get
块。您需要具有IO服务(例如io_context
)在另一个线程中运行,以便它完成。很可能,因为你之前一直在使用堆栈式协程(
asio::spawn
),所以你在coro初始化之后的某个地方使用了io_context::run()
。但是,它运行在主线程上,并且由于没有其他线程参与运行IO服务,因此您不会取得进展,因为您在future::get()
中阻塞了IO服务