Подтвердить что ты не робот

Указание имени нити при использовании Task.StartNew

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

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

Ответ 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, чтобы избежать путаницы.