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í!
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? –
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