2012-02-23 4 views
12

Я нахожу, что имена имен очень полезны при отладке.Как назвать поток, выполняющий задачу?

Я не вижу никакого способа назвать поток, используя аргументы Task.Factory.StartNew()

Так это приемлемо, чтобы назвать нить явно в задаче? например:

private void MyFunc() 
{ 
    Task.Factory.StartNew(() => 
    { 
     Thread.CurrentThread.Name = "Foobulizer"; 
     Foobulize(); 
    }); 
} 

Однако, я понимаю, что потоки могут быть повторно использованы для различных задач, поэтому я должен был бы явно сбросить имя нити в конце задачи? Это кажется довольно взломанным, поэтому я думаю, что это, вероятно, плохая идея, или есть правильный способ сделать это?

ответ

14

Вы не можете сделать это, так как несколько задач могут обмениваться одним или несколькими потоками, зависит от состояния ThreadPool за данный момент времени. В основном задача - это не Thread, это просто абстракция высокого уровня для асинхронной операции. Вы можете использовать свойство Task.Id, но имейте в виду, что Id является только для чтения и int, поэтому вы не можете назначить настраиваемое пользовательское имя.

задач идентификаторы присваиваются по требованию и не обязательно представляют собой порядок в каких случаях Целевых были созданы

Посмотрите на встроенные в Visual Studio 2010 Параллельные функции отладки, возможно, вам будете найти другой подход: Walkthrough: Debugging a Parallel Application

параллельных задач Window:

enter image description here

Для каждого запуска задачи, вы можете прочитать его идентификатор, который возвращается в одноименной собственности, идентификатор и имя потока, который запускает его, его местоположения (зависшее над что отображает всплывающую подсказку, которая имеет весь стек вызовов ). Кроме того, в колонке «Задача» вы можете увидеть метод, который был передан в задачу; другими словами, начальная точка

+0

Вы можете использовать код как 'Task.CurrentId' для соответствующего действия или метода. –

5

По умолчанию TaskScheduler использует .NET ThreadPool для планирования задач. Таким образом, вы получите поток, который уже существует, или тот, который будет использоваться повторно (как потенциально, так и вероятно).

Обратите внимание, что вы можете назвать поток только один раз. Вторая попытка позвонить Thread.CurrentThread.Name поднимет InvalidOperationException. Это особенно плохо, когда поток потоков потоков.

В общем, вы не должны изменять атрибуты нити, которые вы не создали (или не создали) напрямую (имя одного, priority - другие видные кандидаты).

+0

Не понял, что вы можете назвать только один раз. Интересно, спасибо. – GazTheDestroyer

-1

Уверенный, вы можете просто удалить Имя снова, когда закончите. установите thread Name снова в «Idle» ore string.Empty после Foobulize();

+0

Это неверно, вы не можете устанавливать Thread.Name более одного раза. –

Смежные вопросы