2011-11-07 10 views
25

Esiste un modo per specificare il nome di un thread quando si utilizza il metodo Task.StartNewspecificando il nome di un thread quando si utilizza Task.StartNew

var task = Task.Factory.StartNew(MyAction, TaskCreationOption.LongRunning, ??ThreadName??); 
+0

Per quale scopo vuoi nominare il tuo thread? –

+0

I thread effettivi hanno (possono) avere nomi. Ma i compiti no. –

+15

debug @Ron !! – Jon

risposta

16

Non un nome-thread di sicuro.

I thread e le attività non sono correlati 1 a 1.

È possibile utilizzare Task.Id per tracciarlo.

+1

Ho un'attività a lunga esecuzione che significa che viene creato un nuovo thread e che volevo chiamarlo – Jon

+8

No, potrebbe essere creata una nuova discussione *. –

+1

Ho pensato che LongRunning garantisce una nuova discussione – Jon

28

Bene, questo funziona:

class Program { 
    static void Main(string[] args) { 
     var task = Task.Factory.StartNew(() => { 
      Thread.CurrentThread.Name = "foo"; 
      Thread.Sleep(10000); // Use Debug + Break to see it 
     }); 
     task.Wait(); 
    } 
} 

C'è un problema però, il filo di thread ottiene riciclato e non cambierà il suo nome. Questo può essere fonte di confusione, lo vedrai in esecuzione in seguito eseguendo codice completamente diverso. Assicurati di prendere nota di questo. La soluzione migliore è altrimenti utilizzare la colonna Posizione nella finestra Debug + Windows + Thread per trovare il compito indietro.

0

È possibile scrivere il proprio TaskScheduler che imposta Thread.CurrentThread.Name quando mette un'attività su un thread. Una volta eseguita l'attività, il TaskScheduler personalizzato può anche eliminare Thread.CurrentThread.Name per evitare qualsiasi confusione.

+2

In realtà non è possibile - una volta impostata la proprietà nome di una discussione non può più essere modificata. – ChriPf

2

Preferisco utilizzare Thread.CurrentThread.ManagedThreadId. Non è buono come un nome, ma aiuta a tracciare il lavoro specifico per un thread.

Problemi correlati