Подтвердить что ты не робот

Boost asio io_service отправка по почте

Может ли кто-нибудь сказать мне разницу между io_service dispatch и post? Мне было непонятно, что больше подходит для моей проблемы.

Мне нужно вызвать обработчик внутри другого обработчика, и я не знаю, что использовать invoker.

4b9b3361

Ответ 1

Ну, это зависит от контекста вызова, т.е. запускается из 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
}

Ответ 2

см. эту запись в блоге:
Опубликовать или отправить? - Эта тема

Запустив приложение, мы увидим разницу между публикацией и диспетчеризация. Поскольку он мог это сделать, dispatch() выполнил бы fB() напрямую, поэтому мы увидим, что он работает в текущем потоке, и синхронно. С другой стороны, post() попросит io_service сделать задание, асинхронно в другом потоке, и оно сразу возвращается управление вызывающим абонентом.