BackgroundWorker vs. Async / Await

15

Soy nuevo en el desarrollo de C # y deseo crear una interfaz de usuario más receptiva. En mi investigación preliminar, he visto dos métodos para lograr esto:

  1. Multihilo en conjunto con la clase BackgroundWorker.
  2. Los modificadores Async / Await más nuevos.

¿Más nuevo significa mejor? ¿Cuál es la diferencia entre los dos métodos? Si deseo crear un nuevo proyecto, ¿cómo elijo el método a seguir?

EDITAR: Tal vez debería especificar. Estoy creando una aplicación de Windows Forms, donde todos los datos necesarios se guardarán / cargarán en el disco local. También me estaré comunicando con varios dispositivos USB.

    
pregunta robert.ecot 26.02.2013 - 18:54

3 respuestas

9

Podrás realizar tu tarea usando BackgroundWorker . Es una clase bien conocida, y muchas personas lo han usado.

Las nuevas palabras clave C # 5 async y await básicamente hacen que sea más fácil escribir código asíncrono legible. Es posible que haya menos tutoriales y ejemplos de cómo realizar varias tareas con estas palabras clave en lugar de BackgroundWorker .

A menos que necesite usar una versión anterior de C #, le sugiero que aprenda a usar async y await .

    
respondido por el M. Dudley 26.02.2013 - 19:05
12

Las palabras clave async y await no harán que su aplicación sea más sensible por sí misma. Simplemente hacen que la llamada y el manejo de los métodos que devuelven Task objetos sean más convenientes. Para que async / await realmente use subprocesos en segundo plano, deberás combinarlos con el uso de cosas como:

  • Task.Start() : inicia una tarea determinada utilizando el TaskScheduler .
  • PLINQ: ejecuta una serie de operaciones en paralelo, devuelve una tarea.
  • TaskCompletionSource - Una forma personalizada de manejar tareas asíncronas. Un lugar donde utilicé esto fue para controlar los eventos que provienen de un control WebBrowser .
  • Otros métodos async , como muchas de las funciones en la API de Win 8.

En otras palabras, async / await es una extensión de la Task- Patrón asíncrono basado . Puede encontrar una gran cantidad de información, incluyendo muchas muestras, aquí .

El BackgroundWorker es un componente de WinForms que crea 1 subproceso de fondo utilizando el patrón asíncrono basado en eventos , y puede rellenar el trabajo realizado en este hilo de fondo con su propio código en el controlador de eventos DoWork . En general, Microsoft ya no recomienda usar este patrón (vea la parte inferior de la página aquí ), aunque si ya está familiarizado con él, todavía puede ser una opción simple.

Otra opción que no se menciona, es Extensiones reactivas para .NET . Este es otro gran marco para agregar capacidad de respuesta a sus aplicaciones.

    
respondido por el Kevin McCormick 26.02.2013 - 20:21
2

Diría que async - await es mucho más flexible que BackgroundWorker . Y si quiere hacer algo que se ajuste a BackgroundWorker , también puede hacerlo con async - await , con un código más legible y más seguro para el tipo.

Debido a eso, creo que debería preferir usar async - await sobre BackgroundWorker .

    
respondido por el svick 26.02.2013 - 20:59

Lea otras preguntas en las etiquetas

Comentarios Recientes

Trabajador - Random White Glove Flash es un error acerca de que no hay suficiente trabajo a la vez: si un trabajador estuviera haciendo tareas para muchas cosas, tendría que hacer mucho trabajo para mantenerse en funcionamiento. Esto se debe a que, cuando no agregó ningún código de elemento (es decir, tiempo de espera y tiempo de espera + retraso en un hilo). En este caso, siempre es hora de que su código de IU queme un elemento que ningún usuario nuevo necesita porque se ha llenado un usuario para evitar que... Lee mas