avril
2009
L’équipe en charge du développement de la Task Parallel Library (TPL) vient de mettre en ligne la partie 2/3 de leur “saga”
"What’s new in Beta 1 for the Task Parallel Library?”.
La partie 1 se trouve à cette adresse : http://blogs.msdn.com/pfxteam/archive/2009/03/27/9514938.aspx et traite principalement de la librairie et du nouveau modèle d’annulation introduit dans le Framework .NET 4.0.
La partie 2 quant à elle, traite d’un sujet à mon sens plus “sympas”. Les choix du “rollback” par rapport au design de la classe Future. Cette classe que je n’avais pas abordé lors de la session des techdays ni dans mes articles permet d’exécuter du code asynchrone qui renvoi un résultat.
Le “rollback” se situe au notamment au niveau du nom de la classe qui change de Future(Of T) à Task(Of T). Ce changement de nom peut paraitre anecdotique mais il montre bien que le choix de nommage d’une classe est une chose important pour la simplicité de l’utilisation. Parmi les raisons qui ont poussé les développeurs à effectuer ce changement citons :
- Le fait qu’ils définissaient toujours un Future(Of T) comme “une tâche qui renvoi un ou résultats”
- que le nom Future(Of T) ne montrait pas la notion d’héritage entre un Future(Of T) et un Task(Of T)
L’autre point du post qui me parait important est l’annonce de l’introduction d’une nouvelle classe appelé “TaskFactory”. Cette fabrique de tâche va permettre d’éviter décrire des choses du genre :
Task children = null;
FileInfo destFile = null;
foreach (FileInfo file in di.GetFiles())
{
destFile = new FileInfo(Path.Combine(destDir.FullName, file.Name));
children = Task.Create(
CopyAndCheckFile,
new CopyAndCheckFilesThreadParam() { srcFile = file, destFile = destFile }, TaskManager.Default, TaskCreationOptions.RespectCreatorCancellation);
tasks.Add(children);
}
DirectoryInfo subDestDir = null;
foreach (DirectoryInfo subSrcDir in di.GetDirectories())
{
subDestDir = new DirectoryInfo(Path.Combine(destDir.FullName, subSrcDir.Name));
children = Task.Create(
CopyFiles,
new ThreadParams() { srcDir = subSrcDir, destDir = subDestDir},
TaskManager.Default,
TaskCreationOptions.RespectCreatorCancellation);
tasks.Add(children);
}
Task.WaitAll(tasks.ToArray());
(Extrait de la deuxième démo de ma session des techdays ).
Dans cet extrait des tâches sont créées à deux endroits différents mais avec les mêmes options. Le but de la TaskFactory est de positionner les options sur la fabrique et de créer des tâches qui auront directement les bonnes options. Le code de l’exemple en mode “beta 1” donnerais cela :
Task children = null;
TaskFactory factory = new TaskFactory(myScheduler,
TaskCreationOptions.RespectCreatorCancellation, myContinuationOptions); FileInfo destFile = null; foreach (FileInfo file in di.GetFiles()) { destFile = new FileInfo(Path.Combine(destDir.FullName, file.Name)); children = factory.StartNew( CopyAndCheckFile, new CopyAndCheckFilesThreadParam() { srcFile = file, destFile = destFile } ); tasks.Add(children); } DirectoryInfo subDestDir = null; foreach (DirectoryInfo subSrcDir in di.GetDirectories()) { subDestDir = new DirectoryInfo(Path.Combine(destDir.FullName, subSrcDir.Name)); children = factory.StartNew( CopyFiles, new ThreadParams() { srcDir = subSrcDir, destDir = subDestDir} ); tasks.Add(children); } Task.WaitAll(tasks.ToArray());
A noter que n’aillant pas accès à cette beta je n’ai pas réussi à déterminer ce qu’est le myScheduler et le myContinuationOptions (bien qu’il me semble logique que cela correspondent respectivement au TaskManager.Default à aux options de continuation en cas d’exception (arrêt immédiat, attente de la fin des tâches enfants, etc, etc, etc)
Pour finir voici le lien vers l’article du blog de l’équipe de la TPL
Archives
- juillet 2012
- mars 2012
- février 2012
- novembre 2011
- octobre 2011
- mars 2011
- novembre 2010
- octobre 2010
- septembre 2010
- août 2010
- avril 2010
- février 2010
- janvier 2010
- novembre 2009
- octobre 2009
- septembre 2009
- juin 2009
- mai 2009
- avril 2009
- mars 2009
- février 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juin 2008
- mai 2008
- avril 2008
- février 2008
- mai 2007
- avril 2007
- mars 2007
- février 2007
- janvier 2007