Usando a janela Tarefas (C#, Visual Basic, C++)
A janela Tarefas é semelhante à janela Threads, exceto por mostrar informações sobre os objetos System.Threading.Tasks.Task ou task_handle em vez de cada thread. Como threads, as tarefas representam as operações assíncronas que podem ser executadas simultaneamente; no entanto, várias tarefas podem ser executadas no mesmo thread.
No código gerenciado, você pode usar a janela Tarefas quando trabalha com objetos System.Threading.Tasks.Task ou com as palavras-chave await e async (Await e Async no Visual Basic). Para obter mais informações sobre as tarefas no código gerenciado, consulte Programação paralela.
No código nativo, você pode usar a janela Tarefas quando trabalha com grupos de tarefas, algoritmos paralelos, agentes assíncronas e tarefas leves. Para obter mais informações sobre as tarefas no código nativo, consulte Runtime de Simultaneidade.
Você pode usar a janela Tarefas sempre que quebrar no depurador. Você poderá acessá-la clicando no menu Depurar, Janelas e Tarefas. A ilustração a seguir mostra a janela Tarefas no modo padrão.
Observação
Em código gerenciado, um Task que tem o status de TaskStatus.Created, TaskStatus.WaitingForActivation ou TaskStatus.WaitingToRun pode não ser exibido na janela Tarefas quando threads gerenciados estão em estado de suspensão ou junção.
Informações da coluna de tarefas
As colunas na janela Tarefas mostram as informações a seguir.
Nome da coluna | Descrição |
---|---|
Sinalizadores | Mostra quais tarefas estão sinalizadas e permite sinalizar ou remover a sinalização de uma tarefa. |
Ícones | Uma seta amarela indica a tarefa atual. A tarefa atual é a tarefa mais alta no thread atual. Uma seta branca indica a tarefa de quebra, isto é, a que era atual quando o depurador foi chamado. O ícone de pausa indica uma tarefa que foi congelada pelo usuário. Você pode congelar e descongelar uma tarefa clicando com o botão direito na lista. |
ID | Um número fornecido pelo sistema para a tarefa. No código nativo, esse é o endereço da tarefa. |
Status | O estado atual (agendado, ativo, com deadlock, bloqueado, aguardando ou concluído) da tarefa. Uma tarefa agendada é aquela que ainda não foi executada e, portanto, ainda não tem uma pilha de chamadas, um thread alocado ou as informações relacionadas. Uma tarefa ativa é aquela que estava executando o código antes de quebrar no depurador. Uma tarefa em espera ou bloqueada está esperando um evento ser sinalizado, um bloqueio ser liberado ou outra tarefa ser concluída. Uma tarefa com deadlock é uma tarefa de espera cujo thread está bloqueado com outro thread. Passe o cursor do mouse sobre a célula Status para uma tarefa com deadlock ou em espera para ver mais informações sobre o bloqueio. Aviso: a janela Tarefas reporta deadlock apenas uma tarefa bloqueada que usa um primitivo de sincronização com suporte do WCT (Passagem de Cadeia de Espera). Por exemplo, para um objeto Task com deadlock, que usa WCT, o depurador informa Aguardando-com deadlock. Para uma tarefa com deadlock que é gerenciada pelo Runtime de Simultaneidade, que não usa WCT, o depurador informa Aguardando. Para saber mais sobre o WCT, consulte Passagem de cadeia de espera. |
Start Time | A hora em que a tarefa se tornou ativa. |
Duration | O número de segundos que a tarefa esteve ativa. |
Tempo de Conclusão | A hora e conclusão da tarefa. |
Localidade | O local atual da pilha de chamadas da tarefa. Passe o mouse sobre esta célula para ver a pilha de chamada inteira para a tarefa. As tarefas agendadas não têm um valor nessa coluna. |
Tarefa | O método inicial e quaisquer argumentos que são passados para a tarefa quando ela foi criada. |
AsyncState | Para código gerenciado, o status da tarefa. Por padrão, essa coluna está ocultada. Para exibir esta coluna, abra o menu de contexto para um dos cabeçalhos de coluna. Escolha Colunas, AsyncState. |
Pai | A ID da tarefa que criou essa tarefa. Se estiver em branco, a tarefa não terá pai. Isso é aplicável somente para programas gerenciados. |
Atribuição de thread | O nome e a ID do thread no qual a tarefa está em execução. |
AppDomain | Para código gerenciado, o domínio de aplicativo no qual a tarefa está em execução. |
task_group | Para o código nativo, o endereço do objeto task_group que agendou a tarefa. Para agentes assíncronos e tarefas leves, essa coluna é definida como 0. |
Processo | A ID do processo no qual a tarefa está em execução. |
Você pode adicionar colunas à exibição clicando com o botão direito em um cabeçalho de coluna e selecionando as colunas desejadas. (Remova colunas limpando as seleções.) Você também pode reordenar colunas arrastando-as para a esquerda ou direita. O menu de atalho da coluna é mostrado na ilustração a seguir.
Tarefas de classificação
Para classificar as tarefas por critérios da coluna, clique no cabeçalho da coluna. Por exemplo, clicando no cabeçalho de coluna ID, você poderá classificar as tarefas pela ID de tarefa: 1, 2, 3, 4, 5 e assim por diante. Para inverter a ordem de classificação, clique no cabeçalho da coluna novamente. A coluna e a ordem de classificação atuais estão indicadas por uma seta na coluna.
Agrupando tarefas
Você pode agrupar tarefas com base em qualquer coluna na exibição de lista. Por exemplo, ao clicar com o botão direito no cabeçalho da coluna Status e clicar em Agrupar por >[Status], você pode agrupar todas as tarefas que têm o mesmo status. Por exemplo, você pode visualizar rapidamente as tarefas em espera para que poder se concentrar em por que estão bloqueadas. Você também pode recolher um grupo que não é de interesse durante a sessão de depuração. Da mesma forma, você pode agrupar por outras colunas. Um grupo pode ser sinalizado ou ter a sinalização removida apenas clicando no botão ao lado do cabeçalho do grupo. A ilustração a seguir mostra a janela Tarefas no modo agrupado.
Exibição de pai-filho
(Essa exibição está disponível somente para código gerenciado.) Ao clicar com o botão direito em um cabeçalho de coluna Status e, em seguida, em Agrupar por>Pais, você pode alterar a lista de tarefas para uma exibição hierárquica, na qual cada tarefa filho é um subnó que pode ser exibido ou ocultado em seu pai.
Tarefas de sinalização
Você pode sinalizar o thread no qual uma tarefa está sendo executada selecionando o item da lista de tarefas e escolhendo Sinalizar thread atribuído, ou clicando no ícone de sinalizador na primeira coluna. Se você sinalizar várias tarefas, poderá classificar na coluna do sinalizador para levar todas as tarefas sinalizadas para o alto para que você possa se concentrar apenas nelas. Você também pode usar a janela Pilhas Paralelas para exibir apenas tarefas sinalizadas. Isso permite filtrar tarefas nas quais você não está interessado para depuração. Os sinalizadores não são mantidos entre sessões de depuração.
Congelando e descongelando tarefas
Você pode congelar o thread no qual uma tarefa está sendo executada clicando com botão direito no item da lista de tarefas e clicando em Congelar Thread Atribuído. (Se uma tarefa já estiver congelada, o comando será Descongelar Thread Atribuído.) Quando você congela um thread, esse thread não será executado quando você percorrer o código após o ponto de interrupção atual. O comando Congelar Todos os Threads Exceto Esse congelará todos os threads com exceção do que está executando o item da lista de tarefas.
A ilustração a seguir mostra os outros itens de menu para cada tarefa.
Alternando a tarefa ou quadro ativo
O comando Alternar para Tarefa torna a tarefa atual a tarefa ativa. O comando Alternar para Quadro torna o quadro de pilha selecionado o quadro de pilha ativo. O contexto do depurador alterna para a tarefa atual ou o quadro de pilha selecionado.