C++ boost\u asio\u handler\u invoke\u helpers::invoke仍然是boost asio 1.70中调用完成处理程序的受支持方式吗?

C++ boost\u asio\u handler\u invoke\u helpers::invoke仍然是boost asio 1.70中调用完成处理程序的受支持方式吗?,c++,boost-asio,C++,Boost Asio,我正在使用asio将代码从boost 1.65.1迁移到1.70.0。 有一段代码使用boost\u asio\u handler\u invoke\u helpers::invoke,它似乎不像以前的版本那样工作 我在github上发现了这个问题,它解释了executor_binder是如何工作的。因此,在这种情况下,旧的asio\u处理程序\u调用函数似乎不再起作用 类回调\u服务{ 公众: 无效运行(){ 如果(回调函数)回调函数(); } 无效订阅(std::函数回调){ 回调=std:

我正在使用asio将代码从boost 1.65.1迁移到1.70.0。 有一段代码使用boost\u asio\u handler\u invoke\u helpers::invoke,它似乎不像以前的版本那样工作

我在github上发现了这个问题,它解释了executor_binder是如何工作的。因此,在这种情况下,旧的asio\u处理程序\u调用函数似乎不再起作用

类回调\u服务{
公众:
无效运行(){
如果(回调函数)回调函数();
}
无效订阅(std::函数回调){
回调=std::移动(回调);
}
私人:
std::函数回调;
};
模板
自动异步等待回调(回调服务和服务、CompletionToken和token)
{
返回boost::asio::async\u initiate(
[](自动和完成处理程序、回调服务和服务){
s、 订阅([h=std::move(completion\u handler)]()可变{
//这在1.70中仍然有效吗?
boost\u asio\u handler\u invoke\u helpers::invoke(h,h);
});
},
令牌,std::ref(服务));
}
BOOST\u AUTO\u TEST\u案例(TEST\u async\u wait\u回调)
{
boost::asio::io\u上下文ioc;
自动工作=增压::asio::使保护工作(ioc);
回拨服务;
boost::asio::spawn(ioc,[&](boost::asio::yield\u上下文yield){
const auto initiate_thread_id=std::this_thread::get_id();
boost::asio::post(国际奥委会,[&]{
//从另一个线程调用完成处理程序。
标准:螺纹t([&]{
service.run();
});
t、 join();
});
异步等待回调(服务、产量);
//检查我们是否在正确的执行上下文中恢复。
BOOST_CHECK_EQUAL(initiate_thread_id,std::this_thread::get_id());
ioc.stop();
});
ioc.run();
}
测试代码因此错误而失败

Running 1 test case...
error: in "test_async_wait_callback": check initiate_thread_id == std::this_thread::get_id() has failed [10912 != 26444]

这意味着堆栈式协同路由无法在正确的执行上下文上恢复。

我当前的解决方法是通过get_associated_executor调度旧回调

template <typename CompletionToken>
auto async_wait_callback(callback_service& service, CompletionToken&& token)
{
    return boost::asio::async_initiate<CompletionToken, void(void)>(
        [] (auto&& completion_handler, callback_service& s) {
            s.subscribe([h=std::move(completion_handler)] () mutable {
                auto ex = boost::asio::get_associated_executor(h);
                boost::asio::dispatch(ex, [h=std::move(h)] () mutable {
                   boost_asio_handler_invoke_helpers::invoke(h, h);
                });
            });
        },
        token, std::ref(service));
}
模板
自动异步等待回调(回调服务和服务、CompletionToken和token)
{
返回boost::asio::async\u initiate(
[](自动和完成处理程序、回调服务和服务){
s、 订阅([h=std::move(completion\u handler)]()可变{
auto ex=boost::asio::获取关联的执行器(h);
boost::asio::dispatch(例如,[h=std::move(h)]()可变{
boost\u asio\u handler\u invoke\u helpers::invoke(h,h);
});
});
},
令牌,std::ref(服务));
}

我在这方面的参考资料是这篇文章:我认为1.70从根本上使事情变得更简单、更灵活,但遗憾的是它是不同的。我对一个信息灵通的答案非常感兴趣。