Async-attendent Tâche.Run vs HttpClient.GetAsync

Je suis novice en c# 5 asynchrone fonctionnalité.
J'essaie de comprendre la différence entre ces deux implémentations:

Mise en œuvre 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;
    }
}

De mise en œuvre de 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;
        }
    }
}

Je préfère utiliser la deuxième mise en œuvre, car il aura besoin de moins "asynchrone" signatures sur les méthodes dans mon code. J'essaie de comprendre quel est l'avantage de l'utilisation de la classe HttpClient vs à l'aide d'une nouvelle Tâche et en attendant il à la place?

Quelle est la différence entre les deux implémentations?

'async' signatures - ne se soucient d'eux. "async" est juste un "marqueur" pour rester compatible avec l'ancien code. En pré-5.0 vous pourriez avoir des variables/fonctions avec le nom "attendent". Mais depuis les anciennes méthodes n'ont pas le "async" mot-clé, le code sera toujours compilé (w/o des changements) avec C# 5.0.

OriginalL'auteur vondip | 2012-11-23