Utilisation de la fenêtre Tâches parallèles

La fenêtre Tâches parallèles ressemble à la fenêtre Threads, hormis le fait qu'elle comporte des informations sur chaque objet System.Threading.Tasks.Task ou task_handle, et non pas sur chaque thread. Comme les threads, les tâches représentent des opérations asynchrones qui peuvent s'exécuter simultanément. Toutefois, plusieurs tâches peuvent s'exécuter sur le même thread.

En code managé, vous pouvez utiliser la fenêtre Tâches parallèles lorsque vous travaillez avec des objets System.Threading.Tasks.Task. Pour plus d'informations sur les tâches en code managé, consultez Programmation parallèle dans le .NET Framework.

En code natif, vous pouvez utiliser la fenêtre Tâches parallèles lorsque vous travaillez avec des groupes de tâches, des algorithmes parallèles, des agents asynchrones et des tâches légères. Pour plus d'informations sur les tâches en code natif, consultez Concurrency Runtime.

Vous pouvez utiliser la fenêtre Tâches parallèles chaque fois que l'exécution s'arrête dans le débogueur. Pour y accéder, cliquez sur Fenêtres dans le menu Déboguer, puis cliquez sur Tâches parallèles. L'illustration suivante présente la fenêtre Tâches parallèles dans son mode par défaut.

Fenêtre Tâches parallèles

Notes

Dans le code managé, un Task avec l'état Created, WaitingForActivation ou WaitingToRun, ne peut pas être visible dans la fenêtre Tâches parallèles si le thread sur lequel il a été créé ou planifié est à l'état de veille ou à l'état de jonction.

Informations sur les colonnes de la fenêtre Tâches parallèles

Les colonnes de la fenêtre Tâches parallèles contiennent les informations suivantes.

Nom de la colonne

Description

Flags

Affiche les tâches avec indicateur et vous permet d'ajouter un indicateur à une tâche ou d'en supprimer un.

Icônes

La flèche jaune indique la tâche actuelle. La tâche actuelle est la tâche supérieure du thread actuel.

Une flèche blanche indique la tâche d'arrêt, autrement dit, celle qui était actuelle lorsque le débogueur a été appelé.

L'icône de pause indique une tâche gelée par l'utilisateur. Vous pouvez geler et libérer une tâche en cliquant dessus avec le bouton droit dans la liste.

ID

Numéro fourni par le système pour la tâche. En code natif, il s'agit de l'adresse de la tâche.

État

État actuel (planifié, en cours d'exécution, bloqué ou en attente) de la tâche. Une tâche planifiée est une tâche qui n'a pas encore été exécutée et, par conséquent, qui de possède pas encore une pile d'appels, un thread assigné ou des informations connexes.

Une tâche en cours d'exécution est une tâche qui était en train d'exécuter du code avant de s'arrêter dans le débogueur.

Une tâche en attente est une tâche bloquée qui attend le signal d'un événement, la libération d'un verrouillage ou la fin d'une autre tâche.

Une tâche bloquée est une tâche en attente dont le thread est bloqué par un autre thread.

Pointez sur la cellule État d'une tâche bloquée ou en attente pour obtenir plus d'informations sur le blocage.

RemarqueRemarque
La fenêtre Tâches parallèles signale les interblocages uniquement pour les tâches bloquées utilisant une primitive de synchronisation prise en charge par le parcours du type d'attente (WCT).Par exemple, pour un objet Task bloqué qui utilise le WCT, le débogueur signale Attente bloquée.Pour une tâche bloquée gérée par le runtime d'accès concurrentiel qui n'utilise pas Wait Chain Traversal, le débogueur signale En attente.Pour plus d'informations sur WCT, consultez Wait Chain Traversal (page éventuellement en anglais).

Emplacement

Emplacement actuel dans la pile d'appels de la tâche. Pointez sur cette cellule pour visualiser l'ensemble de la pile des appels de la tâche. Les tâches planifiées ne disposent pas de valeur dans cette colonne.

Tâche

Méthode initiale et tous les arguments passés à la tâche lorsqu'elle a été créée.

Parent

ID de la tâche qui a créé cette tâche. Si rien n'est indiqué, la tâche n'a aucun parent. Ceci s'applique uniquement aux programmes gérés.

Affectation de thread

ID et nom du thread sur lequel la tâche s'exécute.

AppDomain

Pour du code managé, domaine d'application dans lequel la tâche s'exécute.

task_group

Pour du code natif, adresse de l'objet task_group qui a planifié la tâche. Pour les agents asynchrones et les tâches légères, cette colonne a la valeur 0.

Vous pouvez ajouter des colonnes à la vue en cliquant avec le bouton droit sur un en-tête de colonne et en sélectionnant ensuite les colonnes souhaitées. (Supprimez des colonnes en effaçant les sélections.) Vous pouvez également réorganiser les colonnes en les faisant glisser à gauche ou à droite. Le menu contextuel des colonnes est présenté dans l'illustration suivante.

Menu contextuel des tâches parallèles

Tri de tâches

Pour trier des tâches en fonction des critères de colonne, cliquez sur l'en-tête d'une colonne. Par exemple, si vous cliquez sur l'en-tête de colonne ID, vous pouvez trier les tâches en fonction de leur ID : 1, 2, 3, 4, 5, etc. Pour inverser l'ordre de tri, cliquez à nouveau sur l'en-tête de la colonne. La colonne et l'ordre de tri actuels sont indiqués par une flèche dans la colonne.

Regroupement de tâches

Vous pouvez regrouper des tâches en fonction d'une colonne de la vue Liste. Ainsi, lorsque vous cliquez avec le bouton droit sur l'en-tête de colonne État et que vous cliquez ensuite sur Grouper par État, vous pouvez regrouper toutes les tâches possédant le même état. Par exemple, vous pouvez visualiser rapidement les tâches en attente afin de vous concentrer sur la raison de leur blocage. Vous pouvez également réduire un groupe qui ne présente pas d'intérêt pour la session de débogage. De la même manière, vous pouvez regrouper les tâches en fonction des autres colonnes. Pour ajouter un indicateur à un groupe (ou en supprimer un), il suffit de cliquer sur le bouton en regard de l'en-tête de groupe. L'illustration suivante présente la fenêtre Tâches parallèles dans son mode regroupé.

Mode groupé des tâches parallèles

Vue Parent enfant

(cette vue est uniquement disponible pour le code managé) En cliquant avec le bouton droit sur un en-tête de colonne et en cliquant ensuite sur Vue Parent enfant, vous pouvez transformer la liste de tâches en une vue hiérarchique, au sein de laquelle chaque tâche enfant constitue un sous-nœud qui peut être affiché ou masqué sous son parent. L'illustration suivante présente les tâches au sein de la vue parent-enfant.

Vue parent-enfant des tâches parallèles

Ajout d'indicateurs à des tâches

Vous pouvez signaler une tâche en cliquant dessus avec le bouton droit, puis en cliquant sur Marquer, ou en cliquant sur l'icône d'indicateur dans la première colonne. Si vous signalez plusieurs tâches, vous pouvez ensuite effectuer un tri sur la colonne d'indicateur pour déplacer toutes les tâches avec indicateur vers le haut afin de pouvoir vous concentrer uniquement sur celles-ci. Vous pouvez également utiliser la fenêtre Piles parallèles pour afficher uniquement les tâches avec indicateur. Cela vous permet d'éliminer par filtrage les tâches qui ne vous intéressent pas pour le débogage. Les indicateurs ne sont pas persistants entre les sessions de débogage.

Gel et libération des tâches

Vous pouvez geler le thread sur lequel une tâche s'exécute en cliquant avec le bouton droit sur la tâche, puis en cliquant sur Verrouiller le thread affecté. (Si une tâche est déjà gelée, la commande s'intitule Libérer le thread affecté.) Lorsque vous gelez un thread, celui-ci ne s'exécute pas lorsque vous parcourez le code après le point d'arrêt actuel. La commande Verrouiller tous les threads sauf celui-ci gèle tous les threads à l'exception de celui qui exécute la tâche.

L'illustration suivante présente les autres éléments de menu pour chaque tâche.

Menu contextuel des tâches parallèles

Voir aussi

Tâches

Utilisation de la fenêtre Piles parallèles

Procédure pas à pas : débogage d'une application parallèle

Concepts

Programmation parallèle dans le .NET Framework

Concurrency Runtime

Autres ressources

Présentation du débogueur

Débogage du code managé

Historique des modifications

Date

Historique

Motif

Mars 2011

Ajout d'informations sur la façon dont le débogueur signale les interblocages.

Améliorations apportées aux informations.