2011-05-08 19 views
6

Io uso Task s per eseguire operazioni asincrone NET.È possibile assegnare un nome temporaneo a un thread dal pool di thread?

Al fine di fare un uso migliore dei fili finestra di debug, vorrei identificare l'operazione attualmente in esecuzione da un nome thread. Tuttavia, la proprietà Name di ciascun thread può essere impostata solo una volta. Quindi, la seconda volta che viene utilizzato lo stesso thread del pool, ricevo un'eccezione di runtime.

C'è un modo per aggirare questo?

+4

Questa non è una risposta diretta alla tua domanda, ma hai guardato la finestra 'Debug -> Windows -> Attività parallele'? Mostra (tra le altre cose): lo stato di un'attività, l'ID del thread su cui è in esecuzione e il suo metodo di destinazione. – Ani

+3

Mi chiedo perché il nome si limiti a essere impostato una volta sola? Potrei capire di avere un nome che deve essere impostato in modo univoco prima dell'avvio di un thread (con il sistema che forse genera un GUID se non è stato specificato nient'altro), ma anche se si desiderava che ogni thread avesse un nome immutabile che lo identificasse, sarebbe utile per avere un campo "descrizione" mutevole. Qualche idea sul perché i nomi/le descrizioni dei thread non siano mutabili? – supercat

risposta

1

Come Ani note nel suo commento: task paralleli finestra vi darà i dettagli dello stato di tutte le attività esistenti. Questa e la finestra degli strumenti Parallel Stacks, fornirà dettagli migliori per la maggior parte delle operazioni di debug.

È possibile assegnare un nome temporaneo a un thread dal pool di thread?

Thread.Name consente di impostare il nome di un filo, ma (se non ricordo male), questo può essere impostato solo una volta per un singolo thread, piuttosto che limita la sua utilità per le discussioni pool di thread (compiti eseguiti su discussioni pool di thread).

4

Quando si pianificano le attività con TaskCreationOptions.LongRunning, viene eseguito sul proprio thread, non su un thread dal ThreadPool, quindi è possibile impostare in modo sicuro il nome del thread.

Usando questo metodo probabilmente avrà impatto sulle prestazioni, quindi vi suggerirei di usare solo durante il debug. Inoltre, sembra che il numero di thread creati in questo modo non sia limitato (a parte i limiti globali sul numero di thread), quindi non si comporterà come senza usare questa opzione.

2

C'è un modo per aggirare questo?

Beh, tecnicamente sì. Voglio dire che tu potresti usare il riflesso per impostare il nome. Vedere la mia risposta here per come farlo. Naturalmente, non è consigliabile impostare i campi privati ​​tramite riflessione per il codice di produzione, ma suppongo che si possa farla franca poiché si desidera utilizzarla solo per il debug.

0

È sempre possibile chiamare il filo nel momento in cui inizia il filo con Thread.CurrentThread.Name.

//this is how you put the thread in the ThreadPool. 
ThreadPool.QueueUserWorkItem(new WaitCallback(this.Handler), this); 


//this is how you name the Thread 
void Handler(object parameters) 
{ 
    Thread.CurrentThread.Name = "MyThreadName"; 
    while(true) 
    { 

    } 
} 
+1

La proprietà Name è WriteOnce, quindi se il nome è stato già impostato (da qualche altra attività in esecuzione su thread ThreadPool?) È un'eccezione. – Sam

Problemi correlati