c++ boost::asio::use_future不执行

yws3nbqq  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(115)

我正在尝试转换一个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之后似乎并没有完全触发写操作。

dtcbnfnu

dtcbnfnu1#

future::get块。您需要具有IO服务(例如io_context)在另一个线程中运行,以便它完成。
很可能,因为你之前一直在使用堆栈式协程(asio::spawn),所以你在coro初始化之后的某个地方使用了io_context::run()。但是,它运行在主线程上,并且由于没有其他线程参与运行IO服务,因此您不会取得进展,因为您在future::get()中阻塞了IO服务

相关问题