我发现命名线程在调试时非常有用。
我看不到使用Task.Factory.StartNew()
在任务中明确命名线程是否可以接受?例如:
private void MyFunc()
{
Task.Factory.StartNew(() =>
{
Thread.CurrentThread.Name = "Foobulizer";
Foobulize();
});
}
但是,我知道线程可能会被重用于不同的任务,所以我需要在任务结束时显式重置线程名称吗?这感觉非常hacky所以我认为这可能是一个坏主意,或者有一个正确的方法来做到这一点?
答案 0 :(得分:16)
您无法执行此操作,因为多个任务可以共享单个或多个线程,这取决于给定时刻的ThreadPool状态。基本上Task不是一个Thread,它只是异步操作的高级抽象。您可以使用Task.Id属性,但请注意Id
是只读且int
类型,因此您无法指定自定义用户友好名称。
任务ID按需分配,不一定代表 创建任务实例的顺序
看一下内置的Visual Studio 2010并行调试功能,也许你会找到另一种方法:Walkthrough: Debugging a Parallel Application
并行任务窗口:
对于每个正在运行的任务,您可以读取其ID返回的ID 同名的属性,运行它的线程的ID和名称,它 位置(将鼠标悬停在该位置会显示一个包含整体的工具提示 调用堆栈)。此外,在“任务”列下,您可以看到该方法 被传递到任务中;换句话说,起点
答案 1 :(得分:5)
默认TaskScheduler
使用.NET ThreadPool
来安排任务。因此,您将获得一个已经存在的线程或一个将被重用的线程(可能,但可能)。
请注意,您只能为线程命名一次。第二次调用Thread.CurrentThread.Name
的尝试将引发InvalidOperationException
。当它是线程池线程时,这尤其糟糕。
一般情况下,您不应更改您未(明确)创建或拥有的线程的属性(名称为1,priority是其他突出的候选者)。
答案 2 :(得分:-2)
当然可以,只需在完成后再删除名称。将线程名称再次设置为“Idle”ore string.Empty在Foobulize();
之后