Можно ли дать временное имя потоку из пула потоков? - PullRequest
6 голосов
/ 08 мая 2011

Я использую Task s для запуска асинхронных операций в .NET.

Чтобы лучше использовать окно отладки потоков, я хотел бы идентифицировать текущую задачу по имени потока.Однако свойство Name каждого потока может быть установлено только один раз.Поэтому во второй раз, когда используется тот же поток из пула, я получаю исключение времени выполнения.

Есть ли способ обойти это?

Ответы [ 4 ]

4 голосов
/ 08 мая 2011

Когда вы планируете свои задачи с помощью TaskCreationOptions.LongRunning, он запускается в своем собственном потоке, а не в потоке из ThreadPool, поэтому вы можете смело устанавливать имя потока.

Использование этого метода, вероятно, будет иметь производительностьвлияние, поэтому я бы предложил использовать его только во время отладки.Кроме того, кажется, что количество потоков, созданных таким образом, не ограничено (кроме глобальных ограничений на количество потоков), поэтому оно не будет вести себя так же, как без использования этой опции.

2 голосов
/ 09 мая 2011

Есть ли способ обойти это?

Ну, технически да.Я имею в виду, что вы могли бы использовать отражение, чтобы установить имя.Смотрите мой ответ здесь , чтобы узнать, как это сделать.Естественно, я не рекомендую устанавливать частные поля с помощью отражения для производственного кода, но я полагаю, что вы можете обойтись без него, поскольку вы хотите использовать его только для отладки.

1 голос
/ 08 мая 2011

Как Ани отмечает в своем комментарии: Окно Parallel Tasks предоставит вам подробную информацию о состоянии всех существующих Задач.Это и окно инструментов Parallel Stacks предоставят более подробную информацию для большинства задач по отладке.

Возможно ли присвоить потоку временное имя из пула потоков?

Thread.Name позволяет задать имя потока, но (если я правильно помню) его можно установить только один раз для одного потока, что ограничивает его полезность для потоков пула потоков (задачи выполняются в потокебассейн темы).

0 голосов
/ 03 октября 2011

Вы всегда можете назвать поток в тот момент, когда поток начинается с Thread.CurrentThread.Name.

//this is how you put the thread in the ThreadPool.
ThreadPool.QueueUserWorkItem(new WaitCallback(this.Handler), this);  


//this is how you name the Thread
void Handler(object parameters)
{
    Thread.CurrentThread.Name = "MyThreadName";
    while(true)
    {

    }
}
...