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
fuente

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
fuente
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
fuente
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
fuente

Lea otras preguntas en las etiquetas