2010-03-29 11 views

Respuesta

6

El despachador puede ser pensado como una cola de eventos que se envían a; un despachador se ejecutará en el hilo de la interfaz de usuario y ejecutará eventos para la interfaz de usuario. En Windows, los controles de UI solo pueden modificarse mediante el hilo que los creó, por lo que cualquier cambio en la UI debe realizarse desde el subproceso de UI, por lo que esa es una de las razones fundamentales por las que las operaciones que modifican elementos de ventana deben enviarse a la UI transportista.

Un hilo de fondo, a su vez, es un hilo diferente de la interfaz de usuario. Entonces, cualquier cosa que se ejecute en uno de estos subprocesos no afectará ni bloqueará la UI.

0

El uso del despachador para ejecutar una operación de larga ejecución todavía hace que se ejecute en el subproceso de interfaz de usuario, solo con una prioridad diferente a la operación actual. El problema aquí es que generalmente, desea que su operación de larga ejecución tenga todo el ancho de banda que sea factible. Corriendo bajo el despachador, la interfaz de usuario te estrangula.

El objetivo del despachador es dar un anclaje a un hilo de fondo de vuelta a la UI para que pueda, por ejemplo, proporcionar una actualización de la UI sobre el progreso de su operación.

Si desea ejecutar una operación en segundo plano y diferir la ejecución a la interfaz de usuario, use un backgroundworker o la nueva biblioteca de tareas. Use el despachador para ordenar las actualizaciones a la IU.

2

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.

0

Las operaciones invocadas por ambos métodos se colocarán en la cola de eventos para ejecutarse en el subproceso de la interfaz de usuario. Invoke ocurrirá de forma síncrona y se bloqueará hasta que la operación se complete, BeginInvoke ocurrirá de forma asincrónica permitiendo que el método de llamada continúe ejecutándose.

Cuestiones relacionadas