Увеличьте asio отправку io_service против почты

Чтобы обойти эту проблему, мы можем использовать Компонент архитектуры навигации , который был введен в Google I / O 2018. Компонент архитектуры навигации упрощает реализацию навигации в приложении для Android.

30
задан ulidtko 8 June 2018 в 07:39
поделиться

1 ответ

Ну, это зависит от контекста вызова, т.е. выполняется ли он из 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
}
36
ответ дан 27 November 2019 в 22:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: