Utilisation de la fenêtre Tâches (C#, Visual Basic, C++)

La fenêtre Tâches ressemble à la fenêtre Threads, hormis le fait qu’elle comporte des informations sur les objets 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.

Le code managé vous permet d’utiliser la fenêtre Tâches lorsque vous travaillez avec des objets System.Threading.Tasks.Task ou avec les mots clés await et async (Await et Asynchrone en Visual Basic). Pour plus d’informations sur les tâches en code managé, consultez Programmation parallèle.

En code natif, vous pouvez utiliser la fenêtre Tâches 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 Runtime d’accès concurrentiel.

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

Tasks window

Tasks window

Note

En code managé, Task qui a un état TaskStatus.Created, TaskStatus.WaitingForActivation ou TaskStatus.WaitingToRun, ne peut pas s’afficher dans la fenêtre Tâches lorsque les threads managés sont à l’état de veille ou à l’état de jonction.

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

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

Nom de la colonne Description
Indicateurs 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.
Identifiant 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é, actif, bloqué, interbloqué, en attente ou terminé) 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 active 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 ou bloquée 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. Avertissement : La fenêtre Tâches 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 Awaiting-deadlocked. 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).
Start Time Heure à laquelle la tâche est devenue active.
Durée Nombre de secondes durant lesquelles la tâche a été active.
Heure d'achèvement Heure à laquelle la tâche s’est terminée.
Lieu 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.
AsyncState En matière de code managé, état de la tâche. Par défaut, cette colonne est masquée. Pour afficher cette colonne, ouvrez le menu contextuel pour l'une des en-têtes de colonnes. Sélectionnez Colonnes, AsyncState.
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.
Assignation 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.
Processus ID du processus que la tâche exécute.

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.

Shortcut view menu in Tasks window

Shortcut view menu in Tasks window

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 en mode regroupé.

Grouped mode in Tasks window

Grouped mode in Tasks window

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 État et en cliquant ensuite sur Grouper par>Parent, 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.

Ajout d'indicateurs à des tâches

Vous pouvez marquer le thread sur lequel une tâche s’exécute en sélectionnant la tâche, puis en choisissant Marquer le thread affecté dans le menu contextuel, 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.

Shortcut thread menu in Tasks window

Shortcut thread menu in Tasks window

Basculement de la tâche ou de l’image active

La commande Basculer vers la tâche fait de la tâche actuelle la tâche active. La commande Basculer vers le frame fait du frame de pile sélectionné le frame de pile actif. Le contexte du débogueur bascule vers la tâche actuelle ou le frame de pile sélectionné.