Может ли кто-нибудь сказать мне разницу между io_service dispatch и post? Мне было непонятно, что больше подходит для моей проблемы.
Мне нужно вызвать обработчик внутри другого обработчика, и я не знаю, что использовать invoker.
Может ли кто-нибудь сказать мне разницу между io_service dispatch и post? Мне было непонятно, что больше подходит для моей проблемы.
Мне нужно вызвать обработчик внутри другого обработчика, и я не знаю, что использовать invoker.
Ну, это зависит от контекста вызова, т.е. запускается из io_service или без:
post
не будет вызывать функцию напрямую, когда-либо, но отложить вызов.dispatch
будет вызывать это прямо сейчас, если вызывающий вызов был вызван из самого io_service, но в противном случае очередь.Таким образом, это зависит от вызова функции, вызывающей post/dispatch, и если данный обработчик можно вызвать сразу или нет.
Что это значит:
... заключается в том, что dispatch
может в конечном итоге вызвать ваш код еще раз (естественно, это зависит от вашего приложения и от того, как вы связываете вызовы), но в целом вы должны убедиться, что ваш обратный вызов является повторным, если вы используйте dispatch
.
dispatch
, таким образом, быстрее, поскольку это позволяет избежать очередей вызова, если это возможно. Он поставляется с некоторыми предостережениями, поэтому вам может потребоваться время от времени использовать post
или всегда (если вы хотите играть в нее безопасно и можете себе это позволить).
Обновление
Чтобы включить некоторые из удаленных ответов @gimpf, более старая версия с улучшенной версией имела эту реализацию отправки (мои комментарии):
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
}
см. эту запись в блоге:
Опубликовать или отправить? - Эта тема
Запустив приложение, мы увидим разницу между публикацией и диспетчеризация. Поскольку он мог это сделать, dispatch() выполнил бы fB() напрямую, поэтому мы увидим, что он работает в текущем потоке, и синхронно. С другой стороны, post() попросит io_service сделать задание, асинхронно в другом потоке, и оно сразу возвращается управление вызывающим абонентом.