Ejecutar tarea en segundo plano en la aplicación WPF

Ejemplo

private void Start(object sender, RoutedEventArgs e) { int progress = 0; for (;;) { System.Threading.Thread.Sleep(1); progress++; Logger.Info(progress); } } 

¿Cuál es el enfoque recomendado (TAP o TPL o BackgroundWorker o Dispatcher u otros) si quiero Start ()

  1. no bloquear el hilo de la interfaz de usuario
  2. puede proporcionar informes de progreso
  3. puede ser cancelado
  4. soporte multiproceso y multinúcleo

Con .NET 4.5 (o .NET 4.0 + Microsoft.Bcl.Async ), la mejor manera es usar API basada en Task y async/await . Permite utilizar el flujo de trabajo de código conveniente (pseudo) secuencial y tiene un manejo estructurado de excepciones.

Ejemplo:

 private async void Start(object sender, RoutedEventArgs e) { try { await Task.Run(() => { int progress = 0; for (; ; ) { System.Threading.Thread.Sleep(1); progress++; Logger.Info(progress); } }); } catch (Exception ex) { MessageBox.Show(ex.Message); } } 

Más lectura:

Async en 4.5: Habilitando el progreso y la cancelación en las API Async .

Async y Await .

Preguntas frecuentes asincrónicas / esperadas .

La mejor manera de hacerlo es mediante el uso de un BackgroundWorker .

La razón por la que señalo esto es porque está especialmente diseñado para procesar el trabajo en segundo plano, dejando el hilo de la interfaz de usuario disponible y receptivo. También ha incorporado notificaciones de Progress y admite Cancellation .

Sugiero ver algunos ejemplos de un BackgroundWorker .

Ahora, cuando empiezas a buscar al trabajador de fondo, hay un punto de Cancellation que tendrás que profundizar. Establecer la propiedad de cancelar de un trabajador en segundo plano no cancela el trabajador de fondo, esto simplemente levanta una bandera para que su método de ejecución se interponga a intervalos regulares y deje de procesar.

Esta es una de mis publicaciones de hace un rato que habla sobre la cancelación de un trabajador de fondo https://stackoverflow.com/a/20941072/1397504

Finalmente. Asincronous no significa multi-core o incluso multi-thread. ( WIKI )

Puede ejecutar una operación en un hilo separado en WPF usando la clase BackgroundWorker.

mira este ejemplo Cómo usar WPF Background Worker

Y lea sobre la clase en MSDN aquí http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx