Comment est-ce que C# 5.0 asynchrone-attendent fonction diffère de la TPL?

Je ne vois pas la différence entre C#(et VB s) nouveau async fonctionnalités, et .NET 4.0 Task Parallel Library. Prenez, par exemple, Eric Lippert du code à partir d'ici:

async void ArchiveDocuments(List<Url> urls) {
    Task archive = null;
    for(int i = 0; i < urls.Count; ++i) {
        var document = await FetchAsync(urls[i]);
        if (archive != null)
            await archive;
        archive = ArchiveAsync(document);
    }
}

Il semble que la await mot-clé sert à deux fins. La première occurrence (FetchAsync) semble signifier, "Si cette valeur est utilisée plus tard dans la méthode et sa tâche n'est pas terminée, attendez jusqu'à ce qu'elle se termine avant de continuer." La deuxième instance (archive) semble signifier, "Si cette tâche n'est pas encore terminé, attendez maintenant jusqu'à la fin." Si je me trompe, corrigez-moi.

Ne pourrait-elle pas tout aussi bien être écrit comme ceci?

void ArchiveDocuments(List<Url> urls) {
    for(int i = 0; i < urls.Count; ++i) {
        var document = FetchAsync(urls[i]);       //removed await
        if (archive != null)
            archive.Wait();                       //changed to .Wait()
        archive = ArchiveAsync(document.Result);  //added .Result
    }
}

J'ai remplacé la première await avec un Task.Result où la valeur est réellement nécessaire, et la deuxième await avec Task.Wait(), où l'attente est en train de se produire. La fonctionnalité est (1) déjà mis en œuvre, et (2) beaucoup plus proche sémantiquement à ce qui se passe réellement dans le code.

Je me rends compte qu'un async méthode est réécrit comme une machine d'état, semblables à des itérateurs, mais je ne vois pas quels sont les avantages que cela implique. Tout code qui nécessite un autre thread pour fonctionner (comme le téléchargement) auront encore besoin d'un autre thread, et tout le code qui ne fonctionne pas (comme la lecture à partir d'un fichier) pourrait encore utiliser le TPL de travailler avec un seul thread.

Je suis évidemment manquant de quelque chose d'énorme ici; quelqu'un peut-il m'aider à comprendre un peu mieux?

InformationsquelleAutor zildjohn01 | 2010-10-29