C# 线程;运行时与 IDE 的结果不同

本文关键字:结果 IDE 线程 运行时 | 更新日期: 2023-09-27 18:31:13

我正在努力更好地理解 C# 5 中的线程。我有以下代码,如果我按 F5(a 和 b 似乎达到 10)或按 CTRL F5(a 和 b 达到 3,根据我正在学习的书中的文字)......有人可以解释为什么吗?另外,我不明白为什么每个线程都停在 10 个,因为它似乎没有任何限制。有人可以向我解释这一点吗?

using System;
using System.Threading;
namespace _70483.Chapter1
{
    public static class Program
    {
        public static ThreadLocal<int> _field =
            new ThreadLocal<int>(() =>
            {
                return Thread.CurrentThread.ManagedThreadId;
            });
        public static void Main()
        {
            new Thread(() =>
            {
                for (int x = 0; x < _field.Value; x++)
                {
                    Console.WriteLine("Thread A: {0}", x);
                }
            }).Start();
            new Thread(() =>
            {
                for (int x = 0; x < _field.Value; x++)
                {
                    Console.WriteLine("Thread B: {0}", x);
                }
            }).Start();
            Console.ReadKey();
        }
    }
}

C# 线程;运行时与 IDE 的结果不同

在我的机器上,调试 B 达到 10,A 达到 9。在没有调试器的版本中,它是 2 和 3。

这里没有什么神奇的。您正在使用线程本地数据,该数据使用 ManagedThreadId,它只是一个标识线程的数字。

在调试中,您可以看到应用程序的大量线程:

Not Flagged     14280   0   Worker Thread   <No Name>       Highest
Not Flagged     6180    3   Worker Thread   <No Name>       Normal
Not Flagged     4364    0   Worker Thread   <No Name>       Normal
Not Flagged     5484    7   Worker Thread   vshost.RunParkingWindow [Managed to Native Transition]  Normal
Not Flagged     4040    8   Worker Thread   .NET SystemEvents   [Managed to Native Transition]  Normal
Not Flagged     6688    9   Main Thread Main Thread MT.Program.Main Normal
Not Flagged >   13472   10  Worker Thread   <No Name>   MT.Program..cctor.AnonymousMethod__4    Normal
Not Flagged     12240   11  Worker Thread   <No Name>   MT.Program.Main.AnonymousMethod__1  Normal

在发布中,vshosting进程没有附加,其他一些线程也不存在,因此你会得到一个小得多的线程ID,但你永远不应该得到A和B是相同的