【问题标题】:How to name a thread running a Task?如何命名运行任务的线程?
【发布时间】:2012-02-23 10:33:14
【问题描述】:

我发现在调试时命名线程非常有用。

我看不出使用Task.Factory.StartNew() 的参数来命名线程

那么在任务中明确命名线程是否可以接受?例如:

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

但是,我很欣赏线程可以重复用于不同的任务,所以我需要在任务结束时显式重置线程名称吗?这感觉很hacky,所以我认为这可能是个坏主意,或者有正确的方法吗?

【问题讨论】:

    标签: c# multithreading task-parallel-library


    【解决方案1】:

    您不能这样做,因为多个任务可以共享相同或多个线程,具体取决于给定时刻的线程池状态。基本上,任务不是线程。它只是异步操作的高级抽象。您可以使用Task.Id 属性,但请记住Id 是只读的并且属于int 类型,因此您不能指定自定义的用户友好名称。

    任务 ID 是按需分配的,不一定代表 创建任务实例的顺序

    看看内置的 Visual Studio 2010 并行调试功能。也许你会找到另一种方法:Walkthrough: Debugging a Parallel Application

    并行任务窗口:

    对于每个正在运行的任务,您可以读取其 ID,该 ID 由 同名属性,运行它的线程的 ID 和名称,它的 位置(将鼠标悬停在该位置上会显示一个工具提示,其中包含整个 调用栈)。此外,在“任务”列下,您可以看到 被传递到任务中;也就是说,起点

    【讨论】:

    • 您可以在代码上使用 Task.CurrentId 相关的任务操作或方法。
    【解决方案2】:

    默认的 TaskScheduler 使用 .NET ThreadPool 来安排任务。因此,您将获得一个已经存在的线程或一个将被重用的线程(两者都可能,但很可能)。

    请注意,您只能为线程命名一次。第二次尝试调用Thread.CurrentThread.Name 将引发InvalidOperationException。当它是线程池线程时,这尤其糟糕。

    一般而言,您不应更改您未(明确)创建或拥有的主题的属性(名称是其中之一,priority 是其他突出的候选人)。

    【讨论】:

      【解决方案3】:

      当然可以,只需在完成后再次删除名称即可。再次将线程名称设置为“空闲”矿石字符串。Foobulize() 之后的空;

      【讨论】:

        猜你喜欢
        • 2011-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        相关资源
        最近更新 更多