C# 为什么线程2不可用?

C# 为什么线程2不可用?,c#,threadpool,C#,Threadpool,在下面的小控制台应用程序中,我正在打印主线程Id和其他5个线程,它正在打印1、3、4、5、6、7,但不是2。线程2是否不可用?该编号是如何生成的 static void Main(string[] args) { Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId}"); Enumerable.Range(0, 5).ToList().ForEach(f =>

在下面的小控制台应用程序中,我正在打印主线程Id和其他5个线程,它正在打印1、3、4、5、6、7,但不是2。线程2是否不可用?该编号是如何生成的

static void Main(string[] args)
    {
        Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId}");

        Enumerable.Range(0, 5).ToList().ForEach(f =>
        {
            new Thread(() =>
            {
                Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId}");
                Thread.Sleep(1000);
            }).Start();

        });
        Console.ReadLine();
    }
线程1 线程3 线程4 螺纹5 螺纹6 线程7


Id=2的线程是垃圾收集器线程。您可以通过运行终结器来检查其Id:

class Test
{
    ~Test()
    {
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
    }
}

static void Main(string[] args)
{
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

    var test = new Test();
    test = null;
    GC.Collect();
}
印刷品:

1
2

Id=2的线程是垃圾收集器线程。您可以通过运行终结器来检查其Id:

class Test
{
    ~Test()
    {
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
    }
}

static void Main(string[] args)
{
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

    var test = new Test();
    test = null;
    GC.Collect();
}
印刷品:

1
2

尝试再次运行它。您可能会有其他结果:)每次都是相同的结果。我知道它应该不同,这是怎么发生的?试着再次运行它。您可能会有其他结果:)每次都是相同的结果。我知道它应该是不同的,这个编号是如何发生的?尽管正确,但请注意不要假设垃圾收集器线程总是2。据我所知,这一点无法保证。@ernodeweard我同意,在记录这一点之前,我们无法保证。尽管正确,但请注意不要假设垃圾收集器线程始终为2。就我所知,这一点没有任何保证。@ernodeweard我同意,我们不能保证,除非有记录在案。