Uso della finestra Attività (C#, Visual Basic, C++)
La finestra Attività è simile alla finestra Thread , ad eccezione del fatto che mostra informazioni sugli System.Threading.Tasks.Task oggetti o task_handle anziché su ogni thread. Analogamente ai thread, le attività rappresentano operazioni asincrone eseguibili simultaneamente; tuttavia, più attività possono essere eseguite nello stesso thread.
Nel codice gestito è possibile usare la finestra Attività quando si utilizzano gli oggetti System.Threading.Tasks.Task o con le parole chiave await e async (Await e Async in Visual Basic). Per altre informazioni sulle attività nel codice gestito, vedere Programmazione parallela.
Nel codice nativo, è possibile usare la finestra Attività quando si utilizzano gruppi di attività, algoritmi paralleli, agenti asincroni e attività leggere. Per altre informazioni sulle attività nel codice nativo, vedere Runtime di concorrenza.
La finestra Attività può essere usata ogni volta che ci si interrompe l'esecuzione nel debugger. È possibile accedere a esso nel menu Debug scegliendo Finestre e facendo clic su Attività. Nell'illustrazione seguente viene mostrata la finestra Attività nella modalità predefinita.
Nota
Nel codice gestito, un oggetto Task con stato TaskStatus.Created, TaskStatus.WaitingForActivation o TaskStatus.WaitingToRun potrebbe non essere visualizzato nella finestra Attività quando i thread gestiti sono in stato di sospensione o join.
Informazioni nelle colonne della finestra Attività
Nelle colonne della finestra Attività vengono visualizzate le informazioni seguenti.
Nome colonna | Descrizione |
---|---|
Flag | Mostra quali attività sono contrassegnate e consente di impostare o rimuovere un flag per un'attività. |
Icone | Una freccia gialla indica l'attività corrente. L'attività corrente è l'attività in primo piano nel thread corrente. Una freccia bianca indica l'attività di interruzione, vale a dire l'attività corrente al momento della chiamata del debugger. L'icona di sospensione indica un'attività bloccata dall'utente. È possibile bloccare e sbloccare un'attività facendovi clic sopra con il pulsante destro del mouse nell'elenco. |
ID | Numero fornito dal sistema per l'attività. Nel codice nativo, è l'indirizzo dell'attività. |
Stato | Stato corrente (pianificato, attivo, bloccato, deadlock, in attesa o completato) dell'attività. Un'attività pianificata è un'attività che non è stata ancora eseguita, pertanto non dispone ancora di uno stack di chiamate, un thread assegnato o informazioni correlate. Un'attività attiva è una che stava eseguendo codice prima di interrompere il debugger. Un'attività in attesa o bloccata è un'attività bloccata perché è in attesa di un evento da segnalare, un blocco da rilasciare o un'altra attività da completare. Un'attività in deadlock è un'attività in attesa il cui thread è in deadlock con un altro thread. Passare il puntatore del mouse sulla cella Stato per un'attività deadlock o in attesa per visualizzare altre informazioni sul blocco. Avviso: la finestra Attività segnala il deadlock solo per un'attività bloccata che usa una primitiva di sincronizzazione supportata dall'attraversamento della catena di attesa (WCT). Ad esempio, per un oggetto deadlock Task , che usa WCT, il debugger segnala Awaiting-deadlocked. Per un'attività in deadlock gestita dal runtime di concorrenza, che non utilizza WCT, viene visualizzato il messaggio In attesa. Per altre informazioni su WCT, vedere Wait Chain Traversal. |
Ora di avvio | Ora in cui l'attività è diventata attiva. |
Durata | Numero di secondi durante i quali l'attività è rimasta attiva. |
Tempo di completamento | Data e ora in cui è stata completata l'esecuzione dell'attività. |
Location | Percorso corrente nello stack di chiamate dell'attività. Passare il mouse su questa cella per visualizzare l'intero stack di chiamate dell'attività. Le attività pianificate non presentano alcun valore in questa colonna. |
Attività | Metodo iniziale ed eventuali argomenti passati all'attività quando è stata creata. |
AsyncState | Per il codice gestito, lo stato dell'attività. Per impostazione predefinita, questa colonna è nascosta. Per visualizzarla, aprire il menu di scelta rapida per una delle intestazioni di colonna. Scegliere Colonne, AsyncState. |
Parent | ID dell'attività che ha creato questa attività. Se la cella è vuota significa che l'attività non dispone di un'attività padre. Questo dato è applicabile ai soli programmi gestiti. |
Assegnazione thread | ID e nome del thread nel quale viene eseguita l'attività. |
AppDomain | Dominio applicazione nel quale viene eseguita l'attività, in caso di codice gestito. |
task_group | Indirizzo dell'oggetto task_group che ha pianificato l'attività, in caso di codice nativo. Per gli agenti asincroni e le attività leggere, questa colonna viene impostata su 0. |
Processo | ID del processo in cui viene eseguita l'attività. |
Per aggiungere colonne alla visualizzazione, fare clic con il pulsante destro del mouse su un'intestazione di colonna e selezionare le colonne desiderate. Rimuovere le colonne deselezionando le selezioni. È anche possibile riordinare le colonne trascinandole verso sinistra o destra. Nell'illustrazione seguente viene mostrato il menu di scelta rapida delle colonne.
Ordinamento delle attività
Per ordinare le attività in base ai criteri delle colonne, fare clic sull'intestazione di colonna. Ad esempio, facendo clic sull'intestazione di colonna ID , è possibile ordinare le attività in base all'ID attività: 1,2,3,4,5 e così via. Per invertire l'ordine, fare nuovamente clic sull'intestazione. La colonna di ordinamento e l'ordinamento correnti sono indicati da una freccia nella colonna.
Raggruppamento delle attività
È possibile raggruppare le attività in base a una qualsiasi colonna nella visualizzazione elenco. Ad esempio, facendo clic con il pulsante destro del mouse sull'intestazione di colonna Stato e scegliendo Raggruppa per>[stato], è possibile raggruppare tutte le attività con lo stesso stato. Ad esempio, è possibile visualizzare rapidamente le attività in attesa in modo che sia possibile concentrarsi sul motivo per cui sono bloccate. È possibile inoltre comprimere un gruppo di poco interesse durante la sessione di debug. Allo stesso modo, è possibile raggruppare in base alle altre colonne. Per contrassegnare o rimuovere il contrassegno di un gruppo, è sufficiente fare clic sul pulsante accanto all'intestazione del gruppo. Nell'illustrazione seguente viene mostrata la finestra Attività nella modalità raggruppata.
Visualizzazione padre/figlio
Questa visualizzazione è disponibile solo per il codice gestito. Facendo clic con il pulsante destro del mouse sull'intestazione di colonna Stato e quindi scegliendo Gruppo per>padre, è possibile modificare l'elenco delle attività in una visualizzazione gerarchica, in cui ogni attività figlio è un sottonodo che può essere visualizzato o nascosto sotto il relativo elemento padre.
Contrassegno delle attività
È possibile contrassegnare il thread dell'attività in cui è in esecuzione un'attività selezionando la voce dell'elenco attività e quindi scegliendo Contrassegno thread assegnato dal menu di scelta rapida oppure facendo clic sull'icona del flag nella prima colonna. Se si contrassegnano diverse attività, sarà successivamente possibile ordinare in base alla colonna del contrassegno in modo da portare tutte le attività contrassegnate in cima e potersi concentrare su di esse. È inoltre possibile usare la finestra Stack in parallelo per visualizzare solo le attività con contrassegno. In questo modo si possono filtrare le attività di poco interesse per il debug. I contrassegni non vengono salvati in modo permanente tra una sessione di debug e l'altra.
Blocco e sblocco delle attività
Per bloccare il thread nel quale viene eseguita un'attività, fare clic con il pulsante destro del mouse sull'elemento dell'elenco di attività e scegliere Blocca thread assegnato. Se un'attività è già bloccata, il comando è Thaw Assigned Thread.) Quando si blocca un thread, tale thread non verrà eseguito quando si esegue il codice dopo il punto di interruzione corrente. Il comando Blocca tutti i thread, ma questo comando blocca tutti i thread tranne quello che esegue l'elemento dell'elenco attività.
Nell'illustrazione seguente vengono mostrate le altre voci di menu per ogni attività.
Passaggio dell'attività o del frame attivo
Il comando Passa all'attività rende l'attività corrente l'attività attiva. Il comando Passa a frame rende lo stack frame selezionato il frame dello stack attivo. Il contesto del debugger passa all'attività corrente o allo stack frame selezionato.