Указание имени нити при использовании Task.StartNew
Можно ли указать имя Thread при использовании метода Task.StartNew
var task = Task.Factory.StartNew(MyAction, TaskCreationOption.LongRunning, ??ThreadName??);
Ответ 1
Не обязательно имя Thread.
Темы и задачи не связаны с 1-к-1.
Вы можете использовать Task.Id для его отслеживания.
Ответ 2
Ну, это работает:
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();
}
}
Есть проблема, однако, поток threadpool получает рециркуляцию и не будет менять свое имя. Это может сбить с толку, вы увидите, что он работает позже, выполняя совершенно другой код. Обязательно обратите внимание на это. Лучше всего использовать столбец Location в окне Debug + Windows + Threads, чтобы вернуть задачу.
Ответ 3
Я предпочитаю использовать Thread.CurrentThread.ManagedThreadId. Это не так хорошо, как имя, но помогает отслеживать конкретную работу для потока.
Ответ 4
Вы можете написать свой собственный TaskScheduler, который устанавливает Thread.CurrentThread.Name, когда он ставит задачу в поток. После выполнения задачи пользовательский TaskScheduler также может очистить Thread.CurrentThread.Name, чтобы избежать путаницы.