Exemple d’utilisation du Task

      Aucun commentaire sur Exemple d’utilisation du Task

Ce qui est compliqué à gérer correctement lors des longs chargements de données, c’est l’interface qui se retrouve parfois bloquée à cause de la masse de données à récupérer, ou même juste à cause du serveur qui est un peu lent. Ce n’est pas très grave en soi pour l’application mais quand cela dépasse plus d’une seconde, c’est synonyme de frustration et d’incompréhension pour l’utilisateur qui ne sais pas ce qu’il se passe avec son application. Est-ce que c’est lui qui a fait une erreur ? Est ce que c’est l’application qui a planté ? Est ce que c’est le réseau qui n’est pas assez rapide ? Aucune idée.

Voilà pourquoi je me propose de vous montrer un exemple de l’utilisation du Task pour y remédier (avec une petite touche personnelle pour s’organiser en étape).

Premier exemple : Ne bloquons plus l’interface !

Commençons par une interface simple, une ListBox et un Button.
Quand l’utilisateur cliquera sur le bouton, nous allons alors générer un nombre aléatoire de produits qui prendra un temps aléatoire à être générés.

Interface de l'exemple du Task

Interface de l’exemple du Task

Organiser le chargement

Nous allons découper ce chargement en trois étapes :
– La préparation du chargement (blocage de l’interface)
– Le chargement (création des produits)
– La fin du chargement (envoi des produis dans la liste)

La préparation du chargement

Pour la préparation du chargement, nous allons simplement désactiver le bouton pour empêcher l’utilisateur de re-cliquer sur le bouton pendant le chargement des produits.

Le chargement

Pour le chargement, nous allons créer un nombre aléatoire de produit, et dans une boucle For nous allons simuler une lenteur avec la méthode Thread.Sleep() et remplir la liste temporaire des produits.

La fin du chargement

Pour la fin du chargement, nous allons remplir la ListBox avec la liste temporaire des produits et réactiver le bouton de chargement.

Lancer le chargement

Bien, nous avons nos trois étapes du chargement, il faut maintenant le lancer.

Dans la méthode de lancement nous retrouvons bien nos trois étape PréparationChargement(), ChargementEnCours() et ChargementTerminé() mais avec le Task et ses options.
La méthode Task.Factory.StartNew() permet de lancer le Task avec la méthode passée en paramètre comme un Action (Delegate simplifié), ensuite on utilise une expression Lambda simple dans la méthode ContinueWith() pour qu’à la fin du Task on continue avec un autre Action et on fini par une option TaskScheduler.FromCurrentSynchronizationContext() pour préciser au Task de s’exécuter dans le Thread UI et non pas dans un Thread à part.

Et voilà, le chargement s’effectue sans bloquer l’interface.

Dans un futur article, nous essayerons d’améliorer l’expérience utilisateur (UX)

Voici un .zip contenant la solution de l’exemple complet : ExempleTask

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *