Je ne vois pas la différence entre les nouvelles fonctionnalités asynchrones de C# (et de VB) et celles de .NET 4.0. Bibliothèque parallèle des tâches . Prenez, par exemple, le code d'Eric Lippert 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 le await
mot-clé sert deux objectifs différents. La première occurrence ( FetchAsync
) semble vouloir dire, "Si cette valeur est utilisée plus tard dans la méthode et que sa tâche n'est pas terminée, attendez qu'elle se termine avant de continuer." La deuxième instance ( archive
) semble vouloir dire, "Si cette tâche n'est pas encore terminée, attendez à l'heure actuelle jusqu'à ce qu'il soit terminé." Si je me trompe, veuillez me corriger.
Ne pourrait-on pas tout aussi bien l'écrire comme ça ?
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é le premier await
avec un Task.Result
où la valeur est réellement nécessaire, et la seconde await
con Task.Wait()
où l'attente se produit réellement. La fonctionnalité est (1)
déjà mis en œuvre, et (2)
beaucoup plus proche sémantiquement de ce qui se passe réellement dans le code.
Je réalise qu'une async
est réécrite comme une machine à état, similaire aux itérateurs, mais je ne vois pas non plus quels avantages cela apporte. Tout code qui nécessite un autre thread pour fonctionner (comme le téléchargement) nécessitera toujours un autre thread, et tout code qui ne le nécessite pas (comme la lecture d'un fichier) pourrait toujours utiliser la TPL pour fonctionner avec un seul thread.
Je suis manifestement en train de rater quelque chose d'énorme ici ; quelqu'un peut-il m'aider à comprendre un peu mieux ?
0 votes
Voir aussi stackoverflow.com/questions/3513432/ y stackoverflow.com/questions/12414601/
0 votes
Voir ce lien qui contient de bons exemples : richnewman.wordpress.com/2012/12/03/