Another .NET Blog

To content | To menu | To search

Friday 18 December 2009

Exécuter une tâche sur le même thread que celui de l'UI

Le problème est classique: vous créez un thread pour réaliser une opération, et vous voulez que ce thread modifie un composant graphique (comme une ProgressBar par exemple). La solution, que vous devez sûrement connaître, consiste à exécuter l'action en question sur le même thread que celui de l'UI, c'est à dire, en WPF, utiliser la fonction BeginInvoke de la propriété Dispatcher de votre contrôle. Si vous avez un grand nombre de modifications de votre interface utilisateur qui sont effectués depuis une ou plusieurs tâches, plutôt que d'appeler BeginInvoke de multiples fois, il existe une solution toute simple, qui consiste à créer et lancer vos tâches en utilisant une TaskFactory à laquelle vous aurez donné comme TaskScheduler celui chargé de gérer l'UI.

Pour cela, c'est très simple:

public partial class MyUserControl : UserControl
{
    private TaskFactory _ui;

    public MyUserControl()
    {
        InitializeComponent();

        _ui = new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext()); 
        _ui.StartNew(() => { Width = 100; } );
    }
}

Et donc toutes les tâches que vous créerez depuis cette TaskFactory seront "schedulées" (je ne sais pas trop comment traduire ça au mieux) sur le thread de l'UI, et donc vous dispensera d'utiliser Dispatcher.BeginInvoke à tout va.

A noter que le code suivant fonctionne tout aussi bien:

public partial class MyUserControl : UserControl
{
    private TaskScheduler _ts;

    public MyUserControl()
    {
        InitializeComponent();

        _ts = TaskScheduler.FromCurrentSynchronizationContext();
        Task.Factory.StartNew(() => { Width = 100; }, _ts);
    }
}

Thursday 17 December 2009

TPL et téléchargement: suite et fin

Après le précédent article d'introduction à la TPL et l'exemple de code de téléchargement d'un fichier sur internet, voici la suite, et fin, avec l'implémentation de la reprise, de la progression et de la fin (par annulation, ou à cause d'une erreur) du téléchargement.

Continue reading...

Introduction aux Parallel Extensions : Télécharger un fichier en asynchrone

Voici mon tout premier article sur les tant attendues (du moins par moi) Parallel Extensions, la librairie de threading .NET 4.0 qui va tout révolutionner (ceci est un avis hautement subjectif j'en conviens).

Au menu de cet article, un cas concret: télécharger un fichier sur internet, de manière asynchrone. Avec en plus la possibilité de stopper le téléchargement, de connaître la progression, et de pouvoir reprendre un téléchargement interrompu.

Continue reading...

Tuesday 24 June 2008

Programmation parallèle

Je suis tombé hier soir (pas de mal, merci) sur cette page, qui fait office de présentation des extensions parallèles pour .NET.

Je ne m'étais jusqu'à maintenant jamais vraiment intéressé à ce pan de la programmation, et cette lecture m'a permis de me rendre compte à quel point la programmation parallèle va revêtir une importance de plus en plus cruciale avec l'avènement des processeurs multi-coeurs, et qui n'est pas prêt de s'arrêter.

Je n'en suis qu'au début de mes lectures sur ce sujet, mais je suis déjà impressionné par la facilité avec laquelle il est déjà possible d'intégrer ça dans nos programmes.

De manière très simplifiée, il suffit par exemple de changer ça:

for (int i = 0; i < MAX; i++)
{
//Traitement
}

en

Parallel.For(0, MAX, (int i)=>
{
//Traitement
});

pour que votre boucle soit parallélisée sur tous vos processeurs!

A cela s'ajoutent également de nouvelles collections génériques prenant en charge le traitement multi-processeurs (list, queue, stack...), la fonction Parallel.Invoke qui permet de réaliser des tâches asynchrones, la synchronisation de tâches via les classes Task et Future, et enfin la possibilité d'utiliser les extensions parallèles avec LINQ. Vous l'aurez compris, beaucoup de choses!

En ce qui concerne les liens, il y a déjà l'introduction dont j'ai parlé plus haut, ensuite il y a le blog de la team qui développe ces extensions, la page de download, et une page MSDN.

N'oubliez pas d'aller jeter un oeil dans le répertoire d'installation des extensions, et surtout dans le dossier Samples, avec des exemples très intéressants (dont un RayTracer en LINQ dont vous me direz des nouvelles ;) )

Have fun !