【问题标题】:Is it possible to give a temporary name to a thread from the thread pool?是否可以为线程池中的线程提供临时名称?
【发布时间】:2011-05-08 08:04:38
【问题描述】:

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

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

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

【问题讨论】:

  • 这不是对您问题的直接回答,但您看过Debug -> Windows -> Parallel Tasks 窗口吗?它显示(除其他外):任务的状态、其运行所在线程的Id 及其目标方法。
  • 我想知道为什么名称仅限设置一次?我可以理解有一个必须在线程启动之前唯一设置的名称(如果没有指定其他内容,系统可能会生成一个 GUID),但即使希望每个线程都有一个不可变的名称来标识它,它也会是有一个可变的“描述”字段很有用。知道为什么线程名称/描述不可变吗?

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      正如Ani 在他的评论中所说:并行任务窗口将为您提供所有现有任务状态的详细信息。此工具窗口以及 Parallel Stacks 工具窗口将为大多数任务调试提供更详细的信息。

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • Name 属性是 WriteOnce,所以如果已经设置了名称(由 ThreadPool 线程上运行的其他任务?),它将抛出异常。
        猜你喜欢
        • 1970-01-01
        • 2012-08-11
        • 2012-06-16
        • 2018-06-22
        • 1970-01-01
        • 2010-10-10
        • 2011-06-27
        • 2011-02-09
        • 2023-03-12
        相关资源
        最近更新 更多