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

有没有办法在使用Task.StartNew方法时指定Thread的名称

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

肯定不是线程名称。

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

您可以使用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列来找回任务。

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

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