Ответ 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
}