Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何命名运行任务的线程?_C#_Multithreading_Task Parallel Library - Fatal编程技术网

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
使用.NET
ThreadPool
调度任务。因此,您将得到一个已经存在的线程或一个将被重用的线程(两者都有可能,但也有可能)

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


一般来说,您不应该更改未(明确)创建或拥有的线程的属性(名称为一个,其他突出的候选名称)。

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

您可以在相关任务操作或方法的代码上使用as
Task.CurrentId