El concepto de BeginInvoke y Invoke se puede pensar de la siguiente manera.
- BeginInvoke significa: ". Haz esto y volver antes de que termine yo bien no se preocupan por el valor de retorno o me puedo llamar de nuevo en esta dirección en algún momento en el futuro"
- Invocar significa: "Haz esto y me sentaré aquí y esperaré a que se complete".
Ahora, cómo esto se relaciona con los despachadores y los hilos de fondo es otro asunto completamente diferente. Como dice Justin, el Dispatcher procesa una cola de cosas por hacer cada vez que el subproceso de la interfaz de usuario queda inactivo. Un hilo de fondo que llama a BeginInvoke en el despachador volverá inmediatamente aunque el despachador no haya podido procesarlo. Si Invoke se hubiera utilizado en su lugar, el hilo de fondo se bloquearía hasta que la UI enhebre el procesamiento completo. Tenga en cuenta que en Silverlight, no hay Invoke en el Dispatcher y, en la mayoría de los casos, es probable que no desee bloquear el hilo de fondo mientras el subproceso de la interfaz de usuario está procesando el trabajo.
Por el contrario, Delegate.BeginInvoke utiliza subprocesos de trabajo en el grupo de subprocesos. Cuando está en el hilo de la interfaz de usuario (o en cualquier hilo), puede llamar a BeginInvoke e Invoke en un delegado. BeginInvoke utilizará un hilo de trabajo para llamar al delegado utilizando la misma semántica que describí anteriormente. Invoke, sin embargo, no usaría un hilo diferente. Simplemente invocaría al delegado de forma síncrona en el contexto de la cadena de llamada y regresaría cuando se completara.
Tenga cuidado al usar la ejecución síncrona en los subprocesos, ya que esto a menudo resulta en interbloqueos si no tiene mucho cuidado.