使用ThreadStatic属性时的不同结果

时间:2016-07-13 17:52:39

标签: c#

我尝试运行使用ThreadStatic属性的代码,由于某种原因,显示了不同的结果。

[ThreadStatic]
    public static int _field;
    public static void Main(string[] args)
    {
        new Thread(() =>
        {
            for(int x = 0; x < 10; x++)
            {
                _field++;
                Console.WriteLine("Thread A: {0}", _field);
            }
        }).Start();

        new Thread(() =>
        {
            for(int x = 0; x < 10; x++)
            {
                _field++;
                Console.WriteLine("Thread B: {0}", _field);
            }
        }).Start();

        Console.ReadKey();
    }

结果1:
Result 1

结果2:
Result 2

任何人都可以向我解释原因吗?谢谢!

2 个答案:

答案 0 :(得分:1)

当您在多个线程上执行代码时,执行顺序变得有些不可预测。你可能反复得到完全相同的结果,但它会做一些不同的事情。

只要您不依赖于一致的行为,这种不一致的行为就可以了。可以想象它就像两个人在画一个建筑物 - 一个从后面开始,一个从前面开始,因为它更快,因为一个人在另一个之前完成并不重要。

DotNetFiddle证明了这一点。它将一堆连续的数字放在ConcurrentQueue中,然后使用多个线程将它们先进先出地移动到另一个队列中。您可能希望它们总是以相同的顺序到达第二个队列,而且通常是这样。但偶尔他们不会。

了解这种行为非常重要。否则我们可以编写多线程代码,我们测试它并且它似乎以一种方式工作,然后我们得到偶尔发生的不可预测的结果但我们无法弄清楚原因,我们不能重复它调试。如果发生这种情况,那么很难找到问题。但如果我们依赖于不可预测的行为,这只是一个问题。

答案 1 :(得分:0)

因为您无法控制线程何时获得CPU时间片。因此每次运行的顺序都不同。