Указание имени потока при использовании Task.StartNew - PullRequest
27 голосов
/ 07 ноября 2011

Есть ли способ указать имя потока при использовании метода Task.StartNew

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

Ответы [ 5 ]

33 голосов
/ 07 ноября 2011

Ну, это работает:

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

Однако есть проблема, поток пула потоков перерабатывается и не меняет своего имени.Это может сбивать с толку, позже вы увидите, что он выполняет совершенно другой код.Обязательно примите это к сведению.В противном случае лучше всего использовать столбец «Расположение» в окне «Отладка + Windows + Потоки», чтобы найти задание обратно.

17 голосов
/ 07 ноября 2011

Точно не имя потока.

Потоки и задачи не связаны между собой.

Вы можете использовать Task.Id для его отслеживания.

2 голосов
/ 15 января 2016

Я предпочитаю использовать Thread.CurrentThread.ManagedThreadId.Это не так хорошо, как имя, но помогает отслеживать конкретную работу для потока.

0 голосов
/ 22 апреля 2019

Задачи используют пул потоков, и поток может быть назван только один раз.Что вы можете сделать, это использовать переменную ThreadStatic.Однако он будет жить между задачами, поэтому установите его в каждой задаче снова.

0 голосов
/ 08 октября 2013

Вы можете написать свой собственный TaskScheduler, который устанавливает Thread.CurrentThread.Name, когда он ставит задачу в потоке. После выполнения задачи пользовательский TaskScheduler может также очистить Thread.CurrentThread.Name, чтобы избежать путаницы.

...