使用Task.StartNew时指定线程的名称

时间:2011-11-07 15:05:46

标签: c# .net .net-4.0 task-parallel-library

使用Task.StartNew方法

时,有没有办法指定线程的名称?
var task = Task.Factory.StartNew(MyAction, TaskCreationOption.LongRunning, ??ThreadName??);

5 个答案:

答案 0 :(得分:33)

嗯,这很有效:

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列来重新找回任务。

答案 1 :(得分:17)

肯定不是线程名称。

线程和任务不是一对一的。

您可以使用Task.Id进行跟踪。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

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