我有一个项目将进行一些网络连接,并希望将底层 Boost Beast HTTP(S) 请求实现包装在期货中。
我从https://www.boost.org/doc/libs/1_69_0/libs/beast/example/http/client/async-ssl/http_client_async_ssl.cpp复制了session
该类,并希望将返回类型更改为. 另外,将位置更改为在 Promise中设置结果而不是打印。session::run()
std::future<http::response<http::string_body>>
// Write the message to standard out
问题是:
- 将用于生成未来的承诺放在哪里?班员是正确的选择吗?
- 放在
boost::asio::io_context ioc
哪里?它是否应该在我自己的应用程序的核心循环中(假设应用程序将在其生命周期内触发多个请求),然后ioc
在发出请求时传递对的引用?呢ioc.run()
?- 我需要它不断运行,我应该打开一个专用线程来运行ioc
以避免阻塞吗? - 如何处理
session
错误?我想使用std::promise
接口并放一个异常以防出现问题 - 基本上fail()
用适当的异常替换示例中的所有调用。但我不能只是将一个异常对象放入承诺中,它期望std::exception_ptr
- 我应该抛出,立即抓住它并放入std::current_exception()
吗?这对我来说似乎是一个糟糕的黑客行为。 - 如果我没有在程序中明确创建任何线程,这会起作用吗?如果不是,那么查询
session
所有任务都已完成的对象的好方法是什么?
编辑:添加了关于ioc
(粗体)的进一步问题