C#线程; Ran时IDE的结果不同

CaR*_*iaK 0 c# multithreading

我试图更好地理解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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*uel 7

好吧,我的机器在调试B中得到10和A到9.在没有调试器的版本中它是2和3.

这里没什么了不起的.您正在使用使用ManagedThreadId的线程本地数据,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
Run Code Online (Sandbox Code Playgroud)

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

  • 确实 - 我只是按原样复制代码,我的A和B总是迭代到不同的值. (2认同)