2013-02-04 23 views
19

Potrebbe essere una domanda banale, ma potrebbe aiutarmi nella comprensione di base.Task.Factory.StartNew vs metodi Async

C'è qualche differenza importante tra due seguenti implementazioni?

  1. Task.Factory.StartNew:

    public Task<string> ReadAllTextAsync(string path) { 
        return Task.Factory.StartNew(() => File.ReadAllText(path)); 
    } 
    
  2. metodo asincrono su StreamReader:

    public async Task<string> ReadAllTextAsync(string path) { 
        using (var stream = File.OpenRead(path)) 
        using (var reader = new StreamReader(stream)) { 
         return await reader.ReadToEndAsync(); 
        } 
    } 
    

risposta

22

Sì, c'è una differenza fondamentale: il Task.Factory.StartNew non preserva contesto sincronizzazione mentre quando utilizza async/attendi che questo contesto sia preservato. Ad esempio, in un'applicazione ASP.NET ciò significa che se si utilizza Task.Factory.StartNew, HttpContext potrebbe non essere accessibile all'interno dell'attività mentre se si utilizza async/attende sarà disponibile.

C'è anche un'altra differenza importante con l'esempio che hai fornito. Nel primo caso si utilizza un'API di blocco: File.ReadAllText(path) mentre nel secondo caso si utilizza una porta di completamento I/O con una vera operazione di I/O asincrona. Ciò significa che nel primo caso si sta compromettendo il thread su cui questa attività viene eseguita durante l'intera esecuzione di questa attività, mentre nel secondo caso questo thread è gratuito grazie a una porta di completamento I/O.

+1

@dtb, non possiamo davvero parlare di un ThreadPool quando si ha a che fare con Task. Il primo esempio sta bloccando il thread in cui viene eseguita l'attività, mentre nel secondo esempio non lo fa. Ho aggiornato la mia risposta per includere queste informazioni. –

+2

+1. Buona risposta – dtb

+1

Grazie, che lo chiarisce (in particolare il secondo punto, ho avuto il sospetto che ci sia qualche inefficienza nell'IO). –

Problemi correlati