C# 如何命名运行任务的线程?
我发现在调试时命名线程非常有用 我无法使用C# 如何命名运行任务的线程?,c#,multithreading,task-parallel-library,C#,Multithreading,Task Parallel Library,我发现在调试时命名线程非常有用 我无法使用Task.Factory.StartNew() 那么,在任务中显式地命名线程是可以接受的吗?例如: private void MyFunc() { Task.Factory.StartNew(() => { Thread.CurrentThread.Name = "Foobulizer"; Foobulize(); }); } 但是,我知道线程可能会被用于不同的任务,所以我需要在任务结束时显
Task.Factory.StartNew()
那么,在任务中显式地命名线程是可以接受的吗?例如:
private void MyFunc()
{
Task.Factory.StartNew(() =>
{
Thread.CurrentThread.Name = "Foobulizer";
Foobulize();
});
}
但是,我知道线程可能会被用于不同的任务,所以我需要在任务结束时显式重置线程名称吗?这感觉很糟糕,所以我认为这可能是个坏主意,或者有一个合适的方法可以做到这一点?您无法做到这一点,因为多个任务可以共享相同或多个线程,具体取决于给定时刻的线程池状态。基本上,任务不是线程。它只是异步操作的高级抽象。您可以使用该属性,但请记住,
Id
是只读的,并且是int
类型,因此您不能指定自定义的用户友好名称
任务ID是按需分配的,不一定代表
创建任务实例的顺序
看看内置的VisualStudio2010并行调试功能。也许您会找到另一种方法:
并行任务窗口:
对于每个正在运行的任务,您可以读取其ID,该ID由
相同的命名属性,运行该属性的线程的ID和名称,以及
位置(将鼠标悬停在显示包含整个
调用堆栈)。此外,在Task列下,您可以看到
被传递到任务中;换句话说,这是一个起点
默认的
TaskScheduler
使用.NETThreadPool
调度任务。因此,您将得到一个已经存在的线程或一个将被重用的线程(两者都有可能,但也有可能)
请注意,一个线程只能命名一次。第二次尝试调用Thread.CurrentThread.Name
将引发错误。当它是线程池线程时,这种情况尤其糟糕
一般来说,您不应该更改未(明确)创建或拥有的线程的属性(名称为一个,其他突出的候选名称)。当然可以,完成后只需再次删除该名称即可。将线程名称再次设置为“Idle”或string.Empty after Foobulize() 您可以在相关任务操作或方法的代码上使用as
Task.CurrentId
。