8

Per esempio, la differenza tra questo codiceQual è la differenza tra l'utilizzo solo di asynс Task e Task?

public Task<IList<NewsSentimentIndexes>> GetNewsSentimentIndexes(DateTime @from, DateTime to = new DateTime(), string grouping = "1h") 
    { 
     var result = _conf.BasePath 
      .AppendPathSegment("news-sentiment-indexes") 
      .SetQueryParams(new 
      { 
       from = from.ToString("s"), 
       to = to.ToString("s"), 
       grouping 
      }); 

     return result 
      .GetStringAsync() 
      .ContinueWith(Desereialize<IList<NewsSentimentIndexes>>); 
    } 

e che

public async Task<IList<NewsSentimentIndexes>> GetNewsSentimentIndexes(DateTime @from, DateTime to = new DateTime(), string grouping = "1h") 
    { 
     var result = _conf.BasePath 
      .AppendPathSegment("news-sentiment-indexes") 
      .SetQueryParams(new 
      { 
       from = from.ToString("s"), 
       to = to.ToString("s"), 
       grouping 
      }); 

     var newsStr = await result.GetStringAsync(); 
     return JsonConvert.DeserializeObject<NewsSentimentIndexes>(newsStr); 
    } 

Qual è corretto o lavorare più velocemente? E basta chiamare questo metodo è necessario attendere o solo un compito?

risposta

6

Il async uno è meglio. Si dovrebbe sempre preferire utilizzare await anziché ContinueWith. Vado nei dettagli di why ContinueWith is bad sul mio blog.

Le differenze semantiche tra queste due implementazioni sono dovute a due differenze: se viene utilizzato o meno async e se viene utilizzato o meno ContinueWith.

Rimozione di async semantica delle eccezioni. Quando viene utilizzato async, tutte le eccezioni vengono rilevate (dalla macchina di stato generata dal compilatore) e posizionate nell'attività restituita. Senza async, le eccezioni vengono generate direttamente (in modo sincrono). Quindi, se BasePath, AppendPathSegment, SetQueryParams o GetStringAsync passi (o restituisci null o qualcosa del genere), allora quell'eccezione verrebbe generata in modo sincrono anziché in modo asincrono, il che potrebbe confondere i chiamanti.

Utilizzo di ContinueWith semantica di esecuzione delle modifiche. In questo caso, Deserialize verrà programmato su TaskScheduler.Current. Questa dipendenza dall'attuale TaskScheduler è una delle parti più complicate di ContinueWith.

+0

Dimmi per favore come essere un WaitAll e il loro seguito. E' impossibile utilizzare l'attendono –

+0

'Task.WaitAll ( _newsService.GetAll (DateTime.Now.AddYears (-1), a: DateTime.Now) .ContinueWith (ContinuationAction), _tradingPairService.GetAllExchangeTradingPairAsync (ExchangeId, TradingPairId) .ContinueWith (ContinuationAction), _companyTypesService.GetAll(). ContinueWith (ContinuationAction)); ' –

+0

Ho letto il tuo blog grazie, ma devi WaitAll example, con le stesse attività. Con la continuazione dello stesso –

-3

Async Task restituisce l'oggetto, mentre Task no.

Così si può fare questo con Async Task:

var yourTask = AsyncTask() 

mentre si può fare questo con Task normale:

NormalTask().someFunction() 
5

Entrambi i metodi ritorna stesso tipo: Task. Ma il metodo async consente di utilizzare la parola chiave await nel suo corpo. Informa il compilatore a generare la macchina a stati per await e il tutto. A proposito di prestazioni asincrone/attese è possibile leggere this post

+0

Ma entrambi i metodi sono asincroni, giusto? –

+0

Sì, lo sono. Inoltre, puoi usare 'await' con qualsiasi metodo (asincrono e non asincrono). – g4s8