Accueil > Général > C# 5 Async Preview

C# 5 Async Preview

Le gros problème du code asynchrone dans C# 4.0 est que l’exécution ne respecte pas l’ordre d’écriture. Il n’est pas toujours évident de savoir ce que va être exécuté et à quel moment quand plusieurs opérations asynchrones s’entrecroisent ce qui nuit à la lisibilité du code et donc le rend plus complexe moins maintenable etc etc
Heureusement, Microsoft travaille la dessus pour nous fournir une solution dans la prochaine version du framework et a dors et déjà publié une CTP de Visual Studio Async qui présente ces nouvelles possibilités. (Téléchargeable ICI)

2 nouveaux mots clé seront disponibles: await et async.
L’objet Task (déjà existant dans le framework 4.0) sera étendu pour gérer les opérations asynchrones par l’objet TaskEx.

Voilà un exemple fourni avec le whitepaper:

public async Task<int> SumPageSizesAsync(IList<Uri> uris) {
    int total = 0;
    foreach (var uri in uris) {
        statusText.Text = string.Format("Found {0} bytes ...", total);
        var data = await new WebClient().DownloadDataAsync(uri);
        total += data.Length;
    }
    statusText.Text = string.Format("Found {0} bytes total", total);
    return total;
}

L’exemple précédent va requêter des pages web en utilisant WebClient.DownloadDataAsync et additionne leurs tailles.
La méthode est marqué comme async ce qui prépare le compilateur à modifier la méthode dès qu’il rencontrera le mot clé await.
Ici, en arrivant à l’appel de la méthode asynchrone DownloadDataAsync, le compilateur génère lui même l’abonnement à l’évènement et le callback.
Toutes les instructions de la méthode suivant le mot clé await sont en fait déplacées dans le callback.
Le prototype décrit la valeur de retour de la méthode comme Task et nous renvoyons un int. C’est en fait le compilateur qui encapsule l’entier dans un objet Task grâce au mot clé async.

Bien que le mot clé await nous fasse penser à un appel bloquant, il n’en est en fait rien d’ailleurs je trouve que le mot clé n’est pas très bien choisi et peu porter à confusion.

Le flot d’éxécution est néanmoins respecté: tout se déroule dans l’ordre ou on l’écrit et le code est bien plus lisible.

Attention pour ceux qui connaissent et utilisent l’objet Task actuel, les méthodes marquées async ne s’exécutent pas dans un nouveau thread elles utilisent le thread courant. Si vous voulez exécuter le code en dehors du thread courant vous devez explicitement utiliser Task.Run().

L’objet TaskEx contient des méthodes intéressantes comme WhenAll par exemple. Elle permet de lancer des opérations asynchrones à la chaîne comme ceci:

var result = await TaskEx.WhenAll(ListeObjets.Select(o=>OperationAsync(o));

Ce qui permet de lancer une série de tâches asynchrones parallèlement et de savoir quand elles sont toutes terminées.

Une très bonne nouvelle: ces fonctionnalités sont disponibles aussi en silverlight! Vous n’aurez donc plus aucune excuse pour laisser figer vos IHM en faisant des appels bloquants😉

Je n’ai pas encore creusé plus loin mais tout ça a l’air très prometteur. Je vous ferai un topo plus détaillé quand j’aurai eu le temps de décortiquer ces nouvelles fonctionnalités un peu mieux.

Enjoy…

Étiquettes : ,
  1. Aucun commentaire pour l’instant.
  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :