BackgroundWorker vs. Async / Attesa

16

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

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

Il più recente significa meglio? Qual è la differenza tra i due metodi? Se desidero creare un nuovo progetto, come faccio a scegliere con quale metodo andare?

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

    
posta robert.ecot 26.02.2013 - 18:54
fonte

3 risposte

9

Sarai in grado di completare il tuo compito usando BackgroundWorker . È una classe ben nota e molte persone lo hanno usato.

Le nuove parole chiave C # 5 async e await fondamentalmente semplificano 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 async e await .

    
risposta data 26.02.2013 - 19:05
fonte
13

Le parole chiave async e await non renderanno più reattiva la tua applicazione. Semplicemente rendono la chiamata e la gestione dei metodi che restituiscono oggetti Task più convenienti. Per fare in modo che async / await usi effettivamente thread in background, dovrai combinare l'utilizzo di elementi come:

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

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

Il BackgroundWorker è un componente WinForms che crea 1 thread in background utilizzando il pattern asincrono basato su eventi , ed è possibile popolare il lavoro svolto su questo thread in background con il proprio codice nel gestore di eventi DoWork . In generale, Microsoft non consiglia più di utilizzare questo modello (vedere la parte inferiore della pagina qui ), anche se lo conosci già potrebbe essere ancora una semplice opzione.

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

    
risposta data 26.02.2013 - 20:21
fonte
3

Direi che async - await è molto più flessibile di BackgroundWorker . E se vuoi fare qualcosa che si adatti a BackgroundWorker , puoi farlo anche con async - await , con un codice più leggibile e più sicuro per il tipo.

Per questo motivo, penso che dovresti preferire utilizzare async - await su BackgroundWorker .

    
risposta data 26.02.2013 - 20:59
fonte

Leggi altre domande sui tag