Article complet: Jour 1 - 13h00 à 14h00 – Visual Studio 2010 et TPL

09/02/10

Permalink 02:07:09, Catégories: .NET, Evènements, Récapitulatif .NET, Récapitulatif, Récapitulatif Microsoft TechDays, TechDays2010, 700 mots   French (BE) , Jérôme Lambert

[.NET][TechDays] Jour 1 - 13h00 à 14h00 – Visual Studio 2010 et TPL

Alors là, grosse déception ! La session était animée par Vincent Lainé, plus connu sous le pseudonyme de dev01 sur nos forums et membre de la rubrique .NET.. Mais rassure-toi Vincent, je n'ai pas été déçu par ta présentation (:p). La déception vient du fait que je voulais assister à la session sur l'extensibilité avec Visual Studio 2010 grâce à Microsoft Extensibility Framework (MEF) dont le titre dans le mail envoyé par Microsoft était « Visual Studio : comment l'adapter à vos besoins » (déjà avec un titre pareil, je ne me rappelais pas que c'était en rapport avec MEF) et dans le listing des sessions avec salles correspondantes, il était marqué « Extensibilité de Visual Studio ».

Ne sachant donc plus ce à quoi je voulais assister, j'ai pris la première session qui parlait de Visual Studio 2010 et qui était donc Visual Studio 2010 et TPL.

[Suite:]

Cette session est consacrée au développement parallèle au travers de votre code managé dont trois fonctionnalités importantes furent abordées :

  1. PLinq
  2. Utilisation des tâches
  3. Les collections concurrentes (qui n'a pas été abordé pas manque de temps)

PLinq est en fait un provider Linq parallélisé afin d'exécuter des requêtes sur vos différents processeurs. Même si nous avons vu qu'il est très facile de réécrire une requête Linq simple en requête PLinq, Vincent a attiré notre attention sur quelques points et pièges à éviter.

Par rapport à une requête Linq, la version PLinq ne sera jamais autant de fois plus rapide qu'il y a de processeurs sur votre machine. Pour faire simple, une requête Linq, qui prend 2 secondes avec une machine munie de deux processeurs, ne s'exécutera pas deux fois plus vite en PLinq. La raison est que PLinq est beaucoup plus lourd car il entraine un certain nombre de synchronisation en différents threads qui sont générés. On pourra donc considérer qu'une requête PLinq sera 1,67 fois plus rapide plutôt que 2 fois.

Un piège à éviter est l'utilisation de ce genre de requêtes en Linq to SQL ou Linq to Entities :

   1: var query = from facture in ctx.Factures.AsParallel()
   2:             select new { factureID = facture.ID, ClientNom = facture.Client.Nom };

Une exception sera générée à l'exécution car cette requête est résolue en deux temps :

  • Récupération des données de la table Facture de manière parallèle
  • Génération des objets anonymes en retour des données chargées de la base de données

Sauf que seules les données de la table Facture ont été récupérées. Les données relatives au client ne le seront pas contrairement à ce que font les ORM Linq. Il va donc être nécessaire de modifier notre requête pour inclure les données de la table Client. Je n'ai pas d'exemple à vous montrer tellement la requête est devenue compliquée pour arriver au résultat espéré.

La seconde partie de la session est l'utilisation des tâches permettant de créer des threads plus facilement et de manière hiérarchique. Différentes classes sont mises à disposition :

  • Task : tout simplement notre tâche
  • TaskScheduler : le scheduler de tâches qui est une classe abstraite
  • TaskFactory : permettant de créer plus facilement un ensemble de tâches ayant le même scheduler, les mêmes options et aussi les mêmes systèmes d'annulation
  • CancellationTokenSource et CancellationToken : pour la gestion des annulations de tâches

Après une démo de mise à niveau d'une application écrite avec l'utilisation de threads classiques pour utiliser au final des tâches, une partie du sujet a été consacré au debugging avec la présentation de nouvelles fenêtres dans Visual Studio et qui permettent de visualiser les tâches parallèles, les piles d'appels, qui bloque qui, les états.

Il est aussi possible de collecter automatiquement un ensemble d'informations lors de l'exécution de votre application au travers de Visual Studio afin de générer un rapport et analyser de manière graphique sur une échelle de temps tout ce qui s'est déroulés au niveau des threads.

Social Bookmarking:

                                     

Commentaires, Pingbacks:

Connectez-vous pour vous abonner à cet article:

Flux de commentaires pour cet article : Atom 1.0  RSS 2.0
Commentaire de: Vincent Lainé [Membre] · http://vincentlaine.developpez.com/
Salut.
En l'occurrence ta requete linq devient :
var query = ctx.Factures.AsParallel().Select(new Func( (f) =>{
f.Client.Load();
Result r = new Result();
r.ID = f.ID;
if( f.Client != null )
r.ClientId = f.Client.ID;
return r;
});

Au passage il faut noter l'abandon de la syntaxe linq pour le passage à la syntaxe "méthodes d'extensions"
Permalien 09/02/10 @ 07:41
Commentaire de: Thomas Levesque [Membre]
Il me semble qu'avec Entity Framework on peut pas faire ça, non ?


 
  var query = from facture in ctx.Factures.Include("Client").AsParallel() 
  select new { factureID = facture.ID, ClientNom = facture.Client.Nom }; 


Auquel cas le code n'est pas tellement plus compliqué...
Permalien 09/02/10 @ 10:09
Commentaire de: Vincent Lainé [Membre] · http://vincentlaine.developpez.com/
Le problème est le même. Que ce passe t-il si il n'y a pas de Client associé à la facture ? (un indice : NullReferenceException ;) ). Il faut donc avoir un moyen de le tester, et donc revenir à l'écriture "complexe".

Votre solution ne fonctionne que si l'on est sur (et certain) que chaque facture à un client d'associé ...
Permalien 09/02/10 @ 13:22
Commentaire de: Thomas Levesque [Membre]
ben c'est simple :

var query = from facture in ctx.Factures.Include("Client").AsParallel()
select new { factureID = facture.ID, ClientNom = (facture.Client != null) ? facture.Client.Nom : null };
Permalien 09/02/10 @ 13:49
Commentaire de: Jérôme Lambert [Membre] · http://jlambert.developpez.com/
Merci Vincent pour tes précisions... Je n'ai effectivement pas eu le temps de recopier la fameuse requête en version parallèle :p
Permalien 12/02/10 @ 14:59

Vous devez être identifié pour poster un commentaire.

Blog de Jérôme Lambert

Responsable .NET
Rédacteur .NET
Analyste/Développeur .NET société Effigy

Syndication

Abonnez-vous au flux

Abonnez-vous à la Newsletter

Me contacter

Live Messenger : Me contacter sur Live Messenger
Le profil Facebook de Jérôme Lambert

Suivez-moi sur Twitter

Blog roll


Statistiques

Locations of visitors to this page
Statistiques sur Feedburner

Rechercher

<  Février 2010  >
Lun Mar Mer Jeu Ven Sam Dim
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28

Syndiquez ce blog XML

Articles :

Commentaires :

Vos questions techniques : forum d'entraide Blogs - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.