Another .NET Blog

To content | To menu | To search

Tag - Threads

Entries feed - Comments feed

Friday 18 December 2009

Methode d'extension pour agir sur l'UI depuis un autre thread en WPF

Je profite d'en avoir parlé lors de mon dernier post pour vous donner une méthode d'extension toute faite qui vous permettra d'appeler automatiquement BeginInvoke sur le Dispatcher d'un contrôle WPF si l'action que vous voulez exécuter sur le contrôle se passe depuis un autre thread que celui sur lequel tourne l'application:

namespace System.Windows.Threading
{
    public static class DispatcherExtensions
    {
        /// 
        /// Executes the action on the thread of the UI if needed, or on the current thread if not
        /// 
        /// The Dispatcher of the control
        /// The action to execute
        /// The dispatcher or the action are null
        public static void CheckAccessAndDo(this Dispatcher dispatcher, Action action)
        {
            CheckAccessAndDo(dispatcher, DispatcherPriority.Normal, action);
        }

        /// 
        /// Executes the action on the thread of the UI if needed, or on the current thread if not
        /// 
        /// The Dispatcher of the control
        /// The priority of the action
        /// The action to execute
        /// The dispatcher or the action are null
        public static void CheckAccessAndDo(this Dispatcher dispatcher, DispatcherPriority priority, Action action)
        {
            if (dispatcher == null) throw new ArgumentNullException("dispatcher");
            if (action == null) throw new ArgumentNullException("action");

            if (dispatcher.CheckAccess())
                action();
            else
            {
                dispatcher.BeginInvoke(priority, action);
            }
        }
    }
}

Pour l'utiliser, c'est très simple et évident:

label.Dispatcher.CheckAccessAndDo(delegate { label.Content = "foo"; } );

De quoi rendre la vie plus facile :p

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 !