web-dev-qa-db-fra.com

ContexteWorker vs Async / Await

Je suis nouveau dans le développement C # et souhaite créer une interface utilisateur plus réactive. Dans mes recherches préliminaires, j'ai vu deux méthodes pour y parvenir:

  1. Multi-threading en conjonction avec la classe BackgroundWorker.
  2. Les nouveaux modificateurs Async/Await.

Est-ce que plus récent signifie mieux? Quelle est la différence entre les deux méthodes? Si je souhaite créer un nouveau projet, comment choisir la méthode à suivre?

EDIT: Je devrais peut-être préciser. Je crée une application Windows Forms, où toutes les données nécessaires seront enregistrées/chargées sur le disque local. Je communiquerai également avec plusieurs périphériques USB.

17
robert.ecot

Vous pourrez accomplir votre tâche en utilisant BackgroundWorker. C'est une classe bien connue et beaucoup de gens l'ont utilisée.

Les nouveaux mots clés C # 5 async et await facilitent essentiellement l'écriture de code asynchrone lisible. Il peut y avoir moins de didacticiels et d'exemples sur la façon d'accomplir diverses tâches avec ces mots clés plutôt que BackgroundWorker.

À moins que vous n'ayez besoin d'utiliser une ancienne version de C #, je suggère d'apprendre à utiliser async et await.

10
M. Dudley

Les mots clés async et await ne rendront pas votre application plus sensible à eux seuls. Ils facilitent simplement l'appel et la gestion des méthodes qui renvoient des objets Task. Pour que async/await utilise réellement des threads d'arrière-plan, vous devrez combiner avec l'utilisation de choses comme:

  • Task.Start() - Démarre une tâche donnée en utilisant TaskScheduler.
  • PLINQ - Exécuter une série d'opérations en parallèle, renvoie une tâche.
  • TaskCompletionSource - Une façon personnalisée de gérer les tâches asynchrones. Un endroit où je l'ai utilisé était de gérer les événements provenant d'un contrôle WebBrowser.
  • Autres méthodes async, telles que la plupart des fonctions de l'API Win 8.

En d'autres termes, async/await est une extension du modèle asynchrone basé sur les tâches. Vous pouvez trouver un grand nombre d'informations, y compris de nombreux exemples, ici .

BackgroundWorker est un composant WinForms qui crée 1 thread d'arrière-plan à l'aide du modèle asynchrone basé sur les événements , et vous pouvez remplir le travail effectué sur ce thread d'arrière-plan avec votre propre code dans le DoWork gestionnaire d'événements. En général, Microsoft ne recommande plus d'utiliser ce modèle (voir le bas de la page ici ), bien que si vous êtes familier avec elle déjà, cela peut encore être une option simple.

Une autre option non mentionnée est le Reactive Extensions for .NET . Ceci est un autre excellent cadre pour ajouter de la réactivité à vos applications.

14
Kevin McCormick

Je dirais que async-await est beaucoup plus flexible que BackgroundWorker. Et si vous voulez faire quelque chose qui correspond à BackgroundWorker, vous pouvez le faire avec async-await aussi, avec un code plus lisible et plus sûr pour le type.

Pour cette raison, je pense que vous devriez préférer utiliser async-await plutôt que BackgroundWorker.

3
svick