2011-11-07 8 views
25

Czy istnieje sposób, aby podać nazwę wątku, gdy przy użyciu metody Task.StartNewOkreślanie nazwy wątku podczas używania Task.StartNew

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

W jakim celu chcesz nawet nazwać swój wątek? –

+0

Rzeczywiste wątki mają (mogą) mieć nazwy. Ale Zadania nie. –

+15

@Ron debugowanie !! – Jon

Odpowiedz

16

Nie Thread-name na pewno.

Wątki i zadania nie są związane z 1 do 1.

Możesz użyć Task.Id do śledzenia.

+1

Mam długo działające zadanie, co oznacza, że ​​tworzony jest nowy wątek i chciałem go nazwać – Jon

+8

Nie, nowy wątek * może * zostać utworzony. –

+1

Myślałem, że LongRunning gwarantuje nowy wątek – Jon

28

Cóż, to działa:

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(); 
    } 
} 

Jest problem jednak wątek pula wątków zostaje poddane recyklingowi i nie zmieni swoją nazwę. Może to być mylące, zobaczysz, że działa później, wykonując całkowicie inny kod. Pamiętaj, aby wziąć to pod uwagę. Najlepszym rozwiązaniem jest użycie kolumny Lokalizacja w oknie Debuguj + Okna + wątki, aby znaleźć zadanie z powrotem.

0

Można napisać własny TaskScheduler, który ustawia Thread.CurrentThread.Name, gdy umieszcza zadanie w wątku. Po wykonaniu tego zadania niestandardowy TaskScheduler może również wyczyścić Thread.CurrentThread.Name, aby uniknąć nieporozumień.

+2

To nie jest możliwe - po ustawieniu właściwości nazwy wątku nie można już jej modyfikować. – ChriPf

2

Wolę używać Thread.CurrentThread.ManagedThreadId. Nie jest tak dobry jak nazwa, ale pomaga śledzić konkretne prace dotyczące wątku.

Powiązane problemy