Как назвать поток, выполняющий задачу?
Я считаю, что имена имен очень полезны при отладке.
Я не вижу способа назвать поток с помощью аргументов Task.Factory.StartNew()
Итак, допустимо ли имя потока явно указывать в задаче? например:
private void MyFunc()
{
Task.Factory.StartNew(() =>
{
Thread.CurrentThread.Name = "Foobulizer";
Foobulize();
});
}
Однако я понимаю, что потоки могут использоваться повторно для разных задач, поэтому мне нужно явно указать reset имя потока в конце задачи? Это кажется довольно взломанным, поэтому я думаю, что это, вероятно, плохая идея или есть правильный способ сделать это?
Ответы
Ответ 1
Вы не можете этого сделать, поскольку несколько задач могут совместно использовать один или несколько потоков, зависит от состояния ThreadPool в данный момент времени. В основном задача - это не Thread, это просто абстракция высокого уровня для асинхронной операции. Вы можете использовать свойство Task.Id, но имейте в виду, что Id
имеет только чтение и тип int
, поэтому вы не можете назначить пользовательский пользователь -дружественное имя.
Идентификаторы задач назначаются по требованию и необязательно представляют порядок, в котором были созданы экземпляры задачи
Взгляните на встроенные функции Visual Studio 2010 Parallel Debugging, возможно, вы найдете другой подход: Пошаговое руководство: отладка параллельного приложения
Окно параллельных задач:
![enter image description here]()
Для каждой запущенной задачи вы можете прочитать ее идентификатор, который возвращается одноименное свойство, идентификатор и имя потока, который его запускает, его местоположение (зависание над ним отображает всплывающую подсказку, содержащую стек вызовов). Кроме того, в колонке "Задачи" вы можете увидеть метод, который был принят в задание; другими словами, начальная точка
Ответ 2
По умолчанию TaskScheduler
используется .NET ThreadPool
для планирования задач. Таким образом, вы получите поток, который уже существует, или тот, который будет повторно использован (как потенциально, так и вероятно).
Обратите внимание, что вы можете назвать поток только один раз. Вторая попытка вызвать Thread.CurrentThread.Name
приведет к повышению InvalidOperationException
. Это особенно плохо, когда поток потока потока.
В общем, вы не должны изменять атрибуты потока, которые вы (явно) не создали или не создали (имя - одно, priority - другое видные кандидаты).
Ответ 3
Конечно, вы можете просто удалить имя снова, когда закончите. установите thread Name снова в "Idle" ore string.Empty после Foobulize();