如何命名运行任务的线程?

时间:2012-02-23 10:33:15

标签: c# multithreading task-parallel-library

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

我看不到使用Task.Factory.StartNew()

的参数命名线程的方法

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

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

但是,我知道线程可能会被重用于不同的任务,所以我需要在任务结束时显式重置线程名称吗?这感觉非常hacky所以我认为这可能是一个坏主意,或者有一个正确的方法来做到这一点?

3 个答案:

答案 0 :(得分:16)

您无法执行此操作,因为多个任务可以共享单个或多个线程,这取决于给定时刻的ThreadPool状态。基本上Task不是一个Thread,它只是异步操作的高级抽象。您可以使用Task.Id属性,但请注意Id是只读且int类型,因此您无法指定自定义用户友好名称。

  

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

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

并行任务窗口:

enter image description here

  

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

答案 1 :(得分:5)

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

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

一般情况下,您不应更改您未(明确)创建或拥有的线程的属性(名称为1,priority是其他突出的候选者)。

答案 2 :(得分:-2)

当然可以,只需在完成后再删除名称。将线程名称再次设置为“Idle”ore string.Empty在Foobulize();

之后