Чтобы обойти эту проблему, мы можем использовать Компонент архитектуры навигации , который был введен в Google I / O 2018. Компонент архитектуры навигации упрощает реализацию навигации в приложении для Android.
Ну, это зависит от контекста вызова, т.е. выполняется ли он из io_service или без него:
post
не будет вызывать функцию напрямую, никогда, но отложит вызов. dispatch
вызовет ее сразу, если диспетчер-вызыватель был вызван из самого io_service, но поставит в очередь в противном случае. Таким образом, все зависит от того, какая функция, вызывающая post/dispatch, была вызвана, и может ли данный обработчик быть вызван сразу или нет.
Что это значит:
... что dispatch
может в конечном итоге вызвать ваш код снова (естественно, это зависит от вашего приложения и того, как вы цепочку вызовов), но в целом вы должны убедиться, что ваш обратный вызов реентерабелен, если вы используете dispatch
.
dispatch
, таким образом, быстрее, поскольку позволяет избежать постановки вызова в очередь, если это возможно. Это связано с некоторыми оговорками, поэтому, возможно, вам понадобится использовать post
время от времени или всегда (если вы хотите играть безопасно и можете себе это позволить).
Обновление
Чтобы включить кое-что из удаленного ответа @gimpf, в более старой версии boost была такая реализация диспетчеризации (мои комментарии):
template <typename Handler>
void dispatch(Handler handler)
{
if (call_stack<win_iocp_io_service>::contains(this)) // called from within io_service?
boost_asio_handler_invoke_helpers::invoke(handler, &handler); // invoke rightaway
else
post(handler); // queue
}