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

本文关键字:线程 Task StartNew 使用 | 更新日期: 2023-09-27 18:13:38

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

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

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

好吧,这行得通:

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。它不如名称好,但确实有助于跟踪线程的具体工作。

任务使用线程池,一个线程只能命名一次。你能做的就是使用ThreadStatic变量。然而,它将存在于任务之间,所以在每个任务中再次设置它。

你可以写你自己的TaskScheduler,当它把一个任务放到一个线程上时设置thread. currentthread . name。任务完成后,您的自定义TaskScheduler也可以清除Thread.CurrentThread.Name以避免任何混淆。