Sono nuovo alla funzione asincrona di C# 5. sto cercando di capire la differenza tra queste due implementazioni:Async-await Task.Run vs HttpClient.GetAsync
Attuazione 1:
private void Start()
{
foreach(var url in urls)
{
ParseHtml(url);
}
}
private async void ParseHtml(string url)
{
var query = BuildQuery(url); //BuildQuery is some helper method
var html = await DownloadHtml(query);
//...
MyType parsedItem = ParseHtml(html);
SaveTypeToDB(parsedItem);
}
private async Task<string> DownloadHtml(string query)
{
using (var client = new HttpClient())
try
{
var response = await client.GetAsync(query);
return (await response.Content.ReadAsAsync<string>());
}
catch (Exception ex)
{
Logger.Error(msg, ex);
return null;
}
}
Attuazione 2:
private void DoLoop()
{
foreach(var url in urls)
{
Start(url);
}
}
private async void Start(url)
{
await Task.Run(() => ParseHtml(url)) ;
}
private void ParseHtml(string url)
{
var query = BuildQuery(url); //BuildQuery is some helper method
var html = DownloadHtml(query);
//...
MyType parsedItem = ParseHtml(html);
SaveTypeToDB(parsedItem);
}
private string DownloadHtml(string query)
{
using (var client = new WebClient())
{
try
{
return client.DownloadString(query);
}
catch (Exception ex)
{
Logger.Error(msg, ex);
return null;
}
}
}
Preferisco utilizzare la seconda implementazione in quanto richiederà meno firme 'asincrone' sui metodi nel mio codice. Sto cercando di capire qual è il vantaggio dell'utilizzo della classe HttpClient rispetto all'utilizzo di una nuova attività e in attesa invece?
C'è qualche differenza tra le due implementazioni?
"firme asincrone" - non preoccuparti di loro. "async" è solo un "marker" per rimanere compatibile con il vecchio codice. In pre-5.0 potevi avere variabili/funzioni con il nome "await". Ma poiché i vecchi metodi non hanno la parola chiave "async", il codice sarà comunque compilato (senza modifiche) con C# 5.0. – igrimpe