Czy istnieje sposób, aby podać nazwę wątku, gdy przy użyciu metody Task.StartNew
Określanie nazwy wątku podczas używania Task.StartNew
var task = Task.Factory.StartNew(MyAction, TaskCreationOption.LongRunning, ??ThreadName??);
Czy istnieje sposób, aby podać nazwę wątku, gdy przy użyciu metody Task.StartNew
Określanie nazwy wątku podczas używania Task.StartNew
var task = Task.Factory.StartNew(MyAction, TaskCreationOption.LongRunning, ??ThreadName??);
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.
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.
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ń.
To nie jest możliwe - po ustawieniu właściwości nazwy wątku nie można już jej modyfikować. – ChriPf
Wolę używać Thread.CurrentThread.ManagedThreadId. Nie jest tak dobry jak nazwa, ale pomaga śledzić konkretne prace dotyczące wątku.
W jakim celu chcesz nawet nazwać swój wątek? –
Rzeczywiste wątki mają (mogą) mieć nazwy. Ale Zadania nie. –
@Ron debugowanie !! – Jon