2011-05-08 63 views
6

我用Task s到在.NET运行的异步操作。是否可以给线程池中的线程一个临时名称?

为了更好地利用该线程调试窗口,我想通过一个线程名来识别当前运行的任务。但是,每个线程的Name属性只能设置一次。所以第二次使用池中的同一个线程时,我得到一个运行时异常。

有什么办法来解决这个问题?

+4

这不是直接回答你的问题,但你看了'调试 - >窗口 - >并行Tasks'窗口?它显示了(除其他外):任务的状态,其运行的线程的“Id”以及其目标方法。 – Ani 2011-05-08 08:39:30

+3

我想知道为什么这个名字只能被设置一次?我可以理解为一个必须唯一设置线程开始前(该系统可能产生一个GUID,如果其他人在没有指定),但即使有人想每个线程有一个不变的名称标识它的名字,它会有用于有一个可变的“描述”字段。任何想法为什么线程名称/描述不可变? – supercat 2012-03-23 16:15:43

回答

1

由于Ani笔记在他的评论:并行任务窗口会给你现有的所有任务状态的详细信息。这和Parallel Stacks工具窗口将为大多数任务调试提供更好的细节。

是否可以给线程池中的线程一个临时名称?

Thread.Name允许您设置线程的名字,但(如果我没有记错),这只能对单个线程,而限制了它的线程池中的线程(任务的线程池中的线程上运行)设置一次。

4

当您使用​​安排任务时,它将在自己的线程上运行,而不是线程池中的线程,因此您可以安全地设置线程的名称。

使用这种方法将可能有表现的影响,所以我建议只在调试过程中使用它。此外,似乎以这种方式创建的线程数量不受限制(除了线程数量的全局限制外),因此它不会像没有使用此选项那样运行。

2

有什么办法来解决这个问题?

当然,从技术上肯定的。我的意思是你可以用使用反射来设置名字。请参阅我的回答here了解如何操作。当然,我不建议通过反射来设置生产代码的私有字段,但我想你可以逃避它,因为你只是想用它进行调试。

0

您可以随时名称,线程开始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) 
    { 

    } 
} 
+1

Name属性是可写,所以如果该名称已被设置(通过线程池线程上运行一些其他的任务吗?),它会抛出异常。 – Sam 2014-04-03 08:10:34

相关问题