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

Gaz*_*yer 17 c# multithreading task-parallel-library

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

我看不到使用参数命名线程的方法 Task.Factory.StartNew()

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

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

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

sll*_*sll 16

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

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

看看内置的Visual Studio 2010并行调试功能,也许您会找到另一种方法:演练:调试并行应用程序

并行任务窗口:

在此输入图像描述

对于每个正在运行的任务,您可以读取其ID,该ID由同名属性返回,运行它的线程的ID和名称,其位置(悬停在其上显示具有整个调用堆栈的工具提示).此外,在"任务"列下,您可以看到传递给任务的方法; 换句话说,出发点


Chr*_*n.K 5

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

请注意,您只能命名一次线程.第二次打电话Thread.CurrentThread.Name会提出一个问题InvalidOperationException.当它是线程池线程时,这尤其糟糕.

通常,您不应更改您未(明确)创建或拥有的线程的属性(名称为1,优先级为其他突出的候选者).