2012-03-31 21 views
7

En mi aplicación WPF estoy cargando contenido usando Dispatcher.BeginInvoke en el constructor. Mi pregunta es ¿bloqueará el hilo de UI?Cuál es la diferencia entre Dispatcher.BeginInvoke y Task.Factory.StartNew

¿O es mejor utilizar Task.Factory.StartNew y luego enviar cosas de vuelta a la interfaz de usuario para que la aplicación se cargue primero independientemente del tiempo de proceso del contenido de carga?

¿Cuál es el mejor enfoque y por qué?

Respuesta

20

Lo hacen dos cosas muy diferentes:

  • Task.Factory.StartNew horarios de un delegado para su ejecución en un subproceso del grupo hilo. El hilo actual continúa ejecutándose sin esperar el resultado de esta tarea (asincrónico). Normalmente generaría una tarea de fondo más larga para que la IU no se bloquee durante demasiado tiempo (no "congelada").

  • Dispatcher.BeginInvoke programa un delegado para la ejecución en el subproceso (UI) del subproceso. Por lo general, esto se hace para actualizar algunos controles UI con los resultados de alguna operación que se ejecutó en un hilo de fondo . Esencialmente estás actualizando la IU aquí.

Para responder a otra pregunta directamente:

No debe programar operaciones largas en el subproceso despachador, por lo general sólo desea actualizar controles de IU aquí. El código en el delegado se ejecutará en el subproceso UI, que está bloqueado durante el tiempo de la ejecución. Simplemente ponga Thread.Sleep(10000) en su código actual (que programa desde el constructor) y verá que la IU se congelará. Utilice una tarea en segundo plano para esto, ya sea con un Task o un trabajador en segundo plano (ambos usarán un hilo del grupo de subprocesos).

o es mejor utilizar Task.Factory.StartNew y luego despachar cosas de nuevo en la interfaz de usuario para que la aplicación se carga primero con independencia de el tiempo del proceso de carga de contenidos.

Sí!

+0

Gracias por la respuesta, Dispatcher.BeginInvoke bloqueará la interfaz de usuario en mi aplicación. Necesito llamar a algunos servicios durante la carga y si el servicio se detiene, entonces cuelga la interfaz de usuario, aunque he utilizado Dispatcher.BeginInvoke, entonces ¿mi pregunta básica es usar dispatcher o Task en este caso? –

+2

si quieres algo que se ejecute en el * fondo * utiliza una tarea, si quieres enviar los resultados a la interfaz de usuario usa 'Dispatcher.BeginInvoke' – BrokenGlass

Cuestiones relacionadas