C# 指定线程';使用Task.StartNew时的名称

C# 指定线程';使用Task.StartNew时的名称,c#,.net,.net-4.0,task-parallel-library,C#,.net,.net 4.0,Task Parallel Library,使用Task.StartNew方法时,是否有方法指定线程的名称 var task = Task.Factory.StartNew(MyAction, TaskCreationOption.LongRunning, ??ThreadName??); 当然不是线程名 线程和任务不是1对1相关的 您可以使用Task.Id来跟踪它 好吧,这是有效的: class Program { static void Main(string[] args) { var task = Tas

使用
Task.StartNew
方法时,是否有方法指定线程的名称

var task = Task.Factory.StartNew(MyAction, TaskCreationOption.LongRunning, ??ThreadName??);

当然不是线程名

线程和任务不是1对1相关的

您可以使用Task.Id来跟踪它

好吧,这是有效的:

class Program {
    static void Main(string[] args) {
        var task = Task.Factory.StartNew(() => {
            Thread.CurrentThread.Name = "foo";
            Thread.Sleep(10000);   // Use Debug + Break to see it
        });
        task.Wait();
    }
}

但是,有一个问题,线程池线程被回收,并且不会更改其名称。这可能会令人困惑,您将看到它在以后运行时执行完全不同的代码。一定要注意这一点。否则,最好使用Debug+Windows+Threads窗口中的Location列查找任务。

您可以编写自己的TaskScheduler,在将任务放入线程时设置Thread.CurrentThread.Name。任务完成后,自定义TaskScheduler还可以清除Thread.CurrentThread.Name以避免任何混淆。

我更喜欢使用Thread.CurrentThread.ManagedThreadId。它不如名称好,但有助于跟踪线程的特定工作。

任务使用线程池,线程只能命名一次。您可以使用ThreadStatic变量。但是,它将在两个任务之间存在,因此请在每个任务中再次设置它。

您甚至想为线程命名的目的是什么?实际的线程确实(可以)有名称。但是任务没有。@Ron调试!!我有一个长时间运行的任务,这意味着创建了一个新线程,我想把它命名为无保证,只是一个可以忽略的提示。请看否,但我确实需要在另一个线程上使用它,我想我会读到,如果我指定LongRunning,那么默认调度程序确实会使用LongRunning选项创建一个线程(在当前,将来可能会更改,实现)。然而,正如Henk在上面的一些评论中所说,没有保证。这就是我所发现的,但普遍的共识是回到手动创建线程并自己管理它?这实际上是不可能的-一旦设置了线程的Name属性,就不能再修改它了。