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 z słowami kluczowymi await i asynchronicznych (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, zobacz Środowisko uruchomieniowe współbieżności.
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.
Uwaga
W kodzie zarządzanym Task stan TaskStatus.Created, TaskStatus.WaitingForActivation lub TaskStatus.WaitingToRun może nie być wyświetlany w oknie Zadania , gdy zarządzane wątki są w stanie uśpienia lub sprzężenia.
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żliwiają flagowanie lub anulowanie opóźnienia zadania. |
Ikony | Żółta strzałka wskazuje bieżące zadanie. Bieżące zadanie jest najbardziej głównym zadaniem w bieżącym wątku. Biała strzałka wskazuje zadanie powodujące niezgodność, czyli bieżące podczas wywoływanego debugera. 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, zakleszczone, oczekujące lub ukończone) zadania. 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. Aktywne zadanie to zadanie, które wykonywało kod przed przerwaniem w debugerze. Zadanie oczekujące lub zablokowane jest zablokowane, ponieważ oczekuje na zasygnalizowanie zdarzenia, zwolnienie blokady lub zakończenie innego zadania. 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 elementu pierwotnego synchronizacji obsługiwanego przez przechodzenie łańcucha oczekiwania (WCT). Na przykład w przypadku zakleszczonego Task obiektu, który używa protokołu WCT, debuger raporty Awaiting-deadlocked. W przypadku zakleszczonego zadania zarządzanego przez środowisko uruchomieniowe współbieżności, które nie korzysta z usługi 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 podrzędne | Metoda początkowa i wszystkie argumenty, które zostały przekazane do zadania podczas jego tworzenia. |
AsyncState | W przypadku kodu zarządzanego stan zadania. Domyślnie ta kolumna jest ukryta. Aby wyświetlić tę kolumnę, otwórz menu kontekstowe dla jednego z nagłówków kolumn. Wybierz pozycję Kolumny, AsyncState. |
Nadrzędny | 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. |
Appdomain | W przypadku kodu zarządzanego domena aplikacji, w której jest wykonywane zadanie. |
Task_group | W przypadku kodu natywnego adres obiektu task_group zaplanowanego zadania. 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.
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ą zablokowane. Możesz również zwinąć grupę, która nie jest interesująca podczas sesji debugowania. 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.
Nadrzędny widok podrzędny
(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ęźle, które można wyświetlić lub ukryć pod jego elementem nadrzędnym.
Flagowanie zadań
Możesz oznaczyć wątek zadania, na którym jest uruchomione zadanie, wybierając element listy zadań, a następnie wybierając pozycję Flaga Przypisana wątek z menu kontekstowego lub klikając ikonę flagi w pierwszej kolumnie. Jeśli oznaczysz kilka zadań, możesz posortować kolumnę flagi, aby 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 oflagowane zadania. Dzięki temu można odfiltrować zadania, które nie są zainteresowane debugowaniem. 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 Odmrażanie przypisanego wątku). Po zablokowaniu wątku ten wątek nie będzie wykonywany podczas przechodzenia przez kod po bieżącym punkcie przerwania. Blokowanie wszystkich wątków, ale to jedno polecenie 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.
Przełączanie aktywnego zadania lub ramki
Polecenie Przełącz na zadanie sprawia, że bieżące zadanie jest aktywne. Polecenie Przełącz na ramkę sprawia, że wybrana ramka stosu jest ramką aktywnego stosu. Kontekst debugera przełącza się do bieżącego zadania lub wybranej ramki stosu.