是否可以从线程池中为线程提供临时名称?

时间:2011-05-08 08:04:39

标签: c# .net multithreading visual-studio-2010 threadpool

我使用Task来在.NET中运行异步操作。

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

有没有办法解决这个问题?

4 个答案:

答案 0 :(得分:4)

当您使用TaskCreationOptions.LongRunning计划任务时,它会在自己的线程上运行,而不是ThreadPool中的线程,因此您可以安全地设置线程的名称。

使用此方法可能会对性能产生影响,因此我建议仅在调试期间使用它。此外,似乎以这种方式创建的线程数量不受限制(除了线程数量的全局限制),因此它不会像不使用此选项那样表现。

答案 1 :(得分:2)

  

有没有办法解决这个问题?

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

答案 2 :(得分:1)

在评论中注明Ani:并行任务窗口将为您提供所有现有任务状态的详细信息。这和Parallel Stacks工具窗口将为大多数任务调试提供更好的细节。

  

是否可以从线程池中为线程提供临时名称?

Thread.Name允许你设置一个线程的名称,但是(如果我没记错的话)这只能为一个线程设置一次,而不是限制它对线程池线程的有用性(在线程池线程上运行的任务)。

答案 3 :(得分: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)
    {

    }
}