是否可以为线程池中的线程指定临时名称

本文关键字:线程 是否 | 更新日期: 2023-09-27 17:55:39

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

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

有什么办法可以解决这个问题吗?

是否可以为线程池中的线程指定临时名称

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

使用此方法可能会影响性能,因此我建议仅在调试期间使用它。此外,以这种方式创建的线程数似乎不受限制(除了线程数的全局限制),因此它的行为与不使用此选项的行为不同。

有什么办法可以解决这个问题吗?

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

正如 Ani 在他的评论中指出的那样:并行任务窗口将为您提供所有现有任务状态的详细信息。此窗口和并行堆栈工具窗口将为大多数任务调试提供更好的详细信息。

是否可以为线程池中的线程指定临时名称?

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

您始终可以在线程以 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)
    {
    }
}