BackgroundWorker vs. Async / Await


16

Sono nuovo nello sviluppo di C # e desidero creare un'interfaccia utente più reattiva. Nella mia ricerca preliminare, ho visto due metodi per raggiungere questo obiettivo:

  1. Multi-threading in combinazione con la classe BackgroundWorker.
  2. I più recenti modificatori Async / Await.

Più recente significa meglio? Qual è la differenza tra i due metodi? Se desidero creare un nuovo progetto, come posso scegliere con quale metodo scegliere?

EDIT: forse dovrei specificare. Sto creando un'applicazione Windows Form, in cui tutti i dati necessari verranno salvati / caricati sul disco locale. Comunicerò anche con diversi dispositivi USB.


Risposte:


10

Sarai in grado di svolgere il tuo compito utilizzando BackgroundWorker. È una classe ben nota e molte persone l'hanno usata.

Il nuovo C # 5 asynce le awaitparole chiave rendono sostanzialmente più semplice la scrittura di codice asincrono leggibile. Potrebbero esserci meno tutorial ed esempi su come eseguire varie attività con queste parole chiave anziché BackgroundWorker.

A meno che non sia necessario utilizzare una versione precedente di C #, suggerisco di imparare come usare asynce await.


13

Le parole chiave asynce awaitnon renderanno la tua applicazione più reattiva da sola. Semplificano semplicemente la chiamata e la gestione di metodi che restituiscono Taskoggetti più convenienti. Per fareasync / awaitutilizzare effettivamente i thread in background, dovrai combinarli con l'uso di cose come:

  • Task.Start()- Avvia una determinata attività utilizzando il TaskScheduler.
  • PLINQ - Esegue una serie di operazioni in parallelo, restituisce un'attività.
  • TaskCompletionSource- Un modo personalizzato per gestire le attività asincrone. Un posto che ho usato per gestire eventi provenienti da aWebBrowser controllo.
  • Altro async metodi, come molte delle funzioni dell'API Win 8.

In altre parole, async/ awaitè un'estensione del modello asincrono basato su attività . Puoi trovare una grande quantità di informazioni, inclusi molti esempi, qui .

Il BackgroundWorkerè un componente WinForms che crea 1 thread in background utilizzando il modello basato su eventi asincroni , e si può compilare il lavoro svolto su questo thread in background con il proprio codice nel DoWorkgestore di eventi. In generale, Microsoft non consiglia più di utilizzare questo modello (vedere la parte inferiore della pagina qui ), sebbene se si ha familiarità con esso già potrebbe essere comunque un'opzione semplice.

Un'altra opzione non menzionata è l' estensione reattiva per .NET . Questo è un altro ottimo framework per aggiungere reattività alle tue app.


Quando dici API Win 8, ciò implica che le funzionalità di Async non sono così ben supportate su Windows 7 (la mia piattaforma di destinazione)?
robert.ecot,

1
Ciao Robert, l'API Win 8 .NET (per app in stile "Metro") che usa asincronismo e aspetta molto da tutto, dall'I / O dei file alla visualizzazione delle finestre di dialogo. In altri componenti .NET, ad esempio FileStream, puoi anche utilizzare asincronizza / attendi con metodi come Stream.ReadAsync. Quindi c'è anche qualche supporto al di fuori di Win 8.
Kevin McCormick,

Fantastico, e grazie anche per i collegamenti aggiornati! Molto utile.
robert.ecot,

1
Non vedo nulla su quella pagina che indichi che BackgroundWorker, in particolare, è sconsigliato.
Kyralessa,

Consiglio anche la lettura di Async VS BackgroundWorker e la serie di post sul blog sulla programmazione concorrente in C # di Stephen Clearly, l'autore dell'omonimo libro pubblicato da O'Reilly.
sentenza

3

Direi che async- awaitè molto più flessibile di BackgroundWorker. E se vuoi fare qualcosa che si adatta BackgroundWorker, puoi farlo con async-await troppo, con il codice di type-safe più leggibile e più.

Per questo motivo, penso che dovresti preferire usare async- awaitover BackgroundWorker.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.