Cóż, to zależy od kontekstu rozmowy, to znaczy jest on prowadzony od wewnątrz io_service lub bez:
post
nie wywoła funkcję bezpośrednio, nigdy, ale odłożyć rozmowę.
dispatch
pokaże to od razu, jeśli wywołanie-wywołanie zostało wywołane z io_service, ale kolejce w przeciwnym razie.
Tak, to zależy od funkcji wywołującej wywołanie/wysyłkę i czy dany handler może zostać wywołany od razu, czy też nie.
Co to oznacza:
... jest to, że w końcu znowu dispatch
może wywołać kod (oczywiście to zależy od aplikacji i jak łańcuch połączeń), ale generalnie należy upewnić się, że oddzwanianie jest ponownie wprowadzane, jeśli używasz dispatch
.
dispatch
jest zatem szybsza, ponieważ pozwala uniknąć kolejkowania połączeń, jeśli to możliwe. Zawiera pewne zastrzeżenia, więc możesz potrzebować od czasu do czasu korzystać z post
lub zawsze (jeśli chcesz grać bezpiecznie i na to stać).
Aktualizacja
Aby włączyć niektóre z usuniętym odpowiedź @gimpf „s, starsza wersja doładowania miał ten realizację wysyłki (moje uwagi):
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
}
Co masz na myśli przez ~ "** nie wywoła funkcji bezpośrednio, nigdy ** Jak zadzwoni funkcja? –
@IgorGanapolsky: Przez * bezpośrednio * rozumiem jako potomek" posterunku "() "Zadzwoń do ciebie" Zamiast tego będzie on wywoływany pośrednio, ponieważ wywołujesz metodę poll() lub podobną metodę z najwyższą pętlą, która sprawdza, czy jest jakaś praca do wykonania (wywołania do wysłania, liczniki czasu, które wygasły) lub nowe dane na gniazdach itp.). – Macke