Udostępnij za pośrednictwem


Korzystanie z okna Zadań (C#, Visual Basic, C++)

Okno Zadania przypomina okno Wątki , z tą różnicą, że zawiera informacje o System.Threading.Tasks.Task obiektach lub task_handle zamiast każdego wątku. Podobnie jak wątki, zadania reprezentują operacje asynchroniczne, które mogą być uruchamiane współbieżnie; jednak wiele zadań może być uruchamianych w tym samym wątku.

W kodzie zarządzanym można użyć okna Zadania podczas pracy z obiektami System.Threading.Tasks.Task lub ze słowami kluczowymi await i async (Await i Async w programie VisualBasic). Aby uzyskać więcej informacji na temat zadań w kodzie zarządzanym, zobacz Programowanie równoległe.

W kodzie natywnym można użyć okna Zadania podczas pracy z grupami zadań, algorytmami równoległymi, agentami asynchronicznymi i zadaniami uproszczonymi. Aby uzyskać więcej informacji na temat zadań w kodzie natywnym, sprawdź Concurrency Runtime.

Możesz użyć okna Zadania za każdym razem, gdy włamiesz się do debugera. Dostęp do niego można uzyskać w menu Debugowanie , klikając pozycję Windows , a następnie klikając pozycję Zadania. Poniższa ilustracja przedstawia okno Zadania w trybie domyślnym.

Okno zadań

Okno zadań

Uwaga / Notatka

W kodzie zarządzanym, gdy wątki zarządzane są w stanie uśpienia lub sprzężenia, obiekt o statusie Task, TaskStatus.WaitingForActivation lub TaskStatus.WaitingToRun może nie być wyświetlany w oknie Zadania.

Informacje o kolumnie zadań

Kolumny w oknie Zadania zawierają następujące informacje.

Nazwa kolumny Opis
flagi Pokazuje, które zadania są oflagowane i umożliwia flagowanie lub usunięcie oznaczenia zadania.
Ikony Żółta strzałka Żółta strzałka wskazuje bieżące zadanie. Bieżące zadanie jest najważniejszym zadaniem w bieżącym wątku.

Zielona strzałka Zielona strzałka wskazuje bieżący kontekst debugera (po przełączeniu do zadania w debugerze).

Biała strzałka Biała strzałka wskazuje zadanie wyłamania się, czyli to, które było bieżące w momencie wywołania debugera.

Ikona wstrzymania Ikona wstrzymania wskazuje zadanie, które zostało zamrożone przez użytkownika. Możesz zablokować i odblokować zadanie, klikając je prawym przyciskiem myszy na liście.
identyfikator Podany przez system numer zadania. W kodzie natywnym jest to adres zadania.
Stan Bieżący stan (zaplanowany, aktywny, zablokowany, zakleszczony, oczekujący lub ukończony) zadania.

Stan zaplanowany Zaplanowane. Zaplanowane zadanie to zadanie, które nie zostało jeszcze uruchomione, dlatego nie ma jeszcze stosu wywołań, przypisanego wątku ani powiązanych informacji.

Stan aktywny Aktywny. Aktywne zadanie to zadanie, które wykonywało kod przed przerwaniem w debugerze.

Stan zablokowany Zablokowany. Zablokowane zadanie to takie, które jest zablokowane, ponieważ oczekuje na sygnał zdarzenia, zwolnienie blokady lub zakończenie innego zadania.

Status: Oczekuje Oczekuje. Zadanie nieblokujące, oczekujące, które używa wzorca asynchronicznego/await.

Stan zablokowany Zablokowany. Zakleszczone zadanie to zadanie oczekujące, którego wątek jest zakleszany innym wątkiem.

Zatrzymaj wskaźnik myszy na komórce Stan dla zakleszczenia lub oczekującego zadania, aby wyświetlić więcej informacji o bloku. Ostrzeżenie: Okno Zadania zgłasza zakleszczenie tylko dla zablokowanego zadania, które używa prymitywu synchronizacji obsługiwanego przez Przewijanie Łańcucha Oczekiwania (WCT). Na przykład w przypadku zakleszczonego Task obiektu, który używa protokołu WCT, debuger raportuje Awaiting-deadlocked. W przypadku zakleszczonego zadania zarządzanego przez Concurrency Runtime, które nie używa WCT, debuger zgłasza Oczekiwanie. Aby uzyskać więcej informacji na temat WCT, zobacz Przechodzenie łańcucha oczekiwania.
Godzina rozpoczęcia Czas, w którym zadanie stało się aktywne.
Czas trwania Liczba sekund, przez które zadanie zostało aktywne.
Czas ukończenia Czas, w którym zadanie zostało ukończone.
Lokalizacja Bieżąca lokalizacja w stosie wywołań zadania. Umieść kursor na tej komórce, aby wyświetlić cały stos wywołań zadania. Zaplanowane zadania nie mają wartości w tej kolumnie.
Zadanie Metoda początkowa i wszystkie argumenty, które zostały przekazane do zadania podczas jego tworzenia.
AsyncState Dla kodu zarządzanego, status realizacji zadania. Domyślnie ta kolumna jest ukryta. Aby wyświetlić tę kolumnę, otwórz menu kontekstowe dla jednego z nagłówków kolumn. Wybierz Kolumny, AsyncState.
nadrzędne Identyfikator zadania, które utworzyło to zadanie. Jeśli jest to puste, zadanie nie ma elementu nadrzędnego. Dotyczy to tylko programów zarządzanych.
Przypisanie wątku Identyfikator i nazwa wątku, na którym jest uruchomione zadanie.
Domena aplikacji W przypadku kodu zarządzanego domena aplikacji, w której jest wykonywane zadanie.
task_group W przypadku kodu natywnego adres obiektu task_group , który planował zadanie. W przypadku agentów asynchronicznych i lekkich zadań ta kolumna ma wartość 0.
Proces Identyfikator procesu, na którym jest uruchomione zadanie.

Możesz dodać kolumny do widoku, klikając prawym przyciskiem myszy nagłówek kolumny, a następnie wybierając odpowiednie kolumny. (Usuń kolumny, usuwając zaznaczenie). Możesz również zmienić kolejność kolumn, przeciągając je w lewo lub w prawo. Menu skrótów kolumn jest pokazane na poniższej ilustracji.

Menu Widok skrótów w oknie Zadania

Menu Widok skrótów w oknie Zadania

Sortowanie zadań

Aby posortować zadania według kryteriów kolumny, kliknij nagłówek kolumny. Na przykład klikając nagłówek kolumny ID , można sortować zadania według identyfikatora zadania: 1,2,3,4,5 itd. Aby odwrócić kolejność sortowania, kliknij ponownie nagłówek kolumny. Bieżąca kolumna sortowania i kolejność sortowania są wskazywane przez strzałkę w kolumnie.

Grupowanie zadań

Zadania można grupować na podstawie dowolnej kolumny w widoku listy. Na przykład klikając prawym przyciskiem myszy nagłówek kolumny Stan , a następnie klikając pozycję Grupuj według>[status], możesz zgrupować wszystkie zadania, które mają ten sam stan. Możesz na przykład szybko zobaczyć oczekujące zadania, aby skoncentrować się na tym, dlaczego są blokowane. Podczas sesji debugowania możesz również zwinąć grupę, która cię nie interesuje. W ten sam sposób można grupować według innych kolumn. Grupę można oznaczyć jako (nie)oflagowaną, klikając przycisk obok nagłówka grupy. Poniższa ilustracja przedstawia okno Zadania w trybie zgrupowanym.

Tryb grupowany w oknie Zadania

Tryb grupowany w oknie Zadania

Widok relacji rodzic-dziecko

(Ten widok jest dostępny tylko dla kodu zarządzanego). Klikając prawym przyciskiem myszy nagłówek kolumny Stan, a następnie klikając pozycję Grupuj według> elementu nadrzędnego, możesz zmienić listę zadań na widok hierarchiczny, w którym każde zadanie podrzędne jest podwęzłem, które można wyświetlić lub ukryć pod jego elementem nadrzędnym.

Flagowanie zadań

Możesz oznaczyć wątek, na którym jest uruchomione zadanie, wybierając element z listy zadań, a następnie wybierając opcję Oznacz Przypisany Wątek z menu kontekstowego lub klikając ikonę flagi w pierwszej kolumnie. Jeśli oznaczysz kilka zadań, możesz posortować według kolumny flagi, co pozwoli przenieść wszystkie oflagowane zadania do góry, aby skoncentrować się tylko na nich. Możesz również użyć okna Stosy równoległe, aby wyświetlić tylko oznaczone zadania. Dzięki temu można odfiltrować zadania, którymi nie jesteś zainteresowany podczas debugowania. Flagi nie są utrwalane między sesjami debugowania.

Zadania zamrażania i rozmrażania

Możesz zablokować wątek, na którym jest uruchomione zadanie, klikając prawym przyciskiem myszy element listy zadań, a następnie klikając pozycję Zablokowanie przypisanego wątku. (Jeśli zadanie jest już zamrożone, polecenie to Thaw Assigned Thread). Po zablokowaniu wątku ten wątek nie będzie wykonywany podczas przechodzenia przez kod po bieżącym punkcie przerwania. Zamroź wszystkie wątki poza tym komenda zawiesza wszystkie wątki z wyjątkiem tego, który wykonuje element listy zadań.

Na poniższej ilustracji przedstawiono inne elementy menu dla każdego zadania.

Menu skrótów wątków w oknie Zadania

Menu skrótów wątków w oknie Zadania

Przełączanie aktywnego zadania lub ramki

Polecenie Przełącz na zadanie sprawia, że bieżące zadanie jest aktywne. Polecenie Przełącz na ramkę powoduje, że wybrana ramka stosu staje się aktywną ramką stosu. Kontekst debugera przełącza się do bieżącego zadania lub wybranej ramki na stosie.