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