Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ThreadStatic属性时会产生不同的结果_C# - Fatal编程技术网

C# 使用ThreadStatic属性时会产生不同的结果

C# 使用ThreadStatic属性时会产生不同的结果,c#,C#,我试着运行一个使用ThreadStatic属性的代码,由于某些原因,会显示不同的结果 [ThreadStatic] public static int _field; public static void Main(string[] args) { new Thread(() => { for(int x = 0; x < 10; x++) { _f

我试着运行一个使用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();
    }
[ThreadStatic]
公共静态int_字段;
公共静态void Main(字符串[]args)
{
新线程(()=>
{
对于(int x=0;x<10;x++)
{
_字段++;
WriteLine(“线程A:{0}”,_字段);
}
}).Start();
新线程(()=>
{
对于(int x=0;x<10;x++)
{
_字段++;
WriteLine(“线程B:{0}”,_字段);
}
}).Start();
Console.ReadKey();
}
结果1:

结果2:


谁能给我解释一下原因吗?谢谢大家!

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

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

只要你不依赖一致的行为,这种不一致的行为是可以的。把它想象成两个人在画一栋建筑——一个从后面开始,另一个从前面开始,因为速度更快,而且一个先完成另一个并不重要

这表明。它将一组连续的数字放入一个
ConcurrentQueue
,然后使用多个线程将它们先入先出移动到另一个队列中。您可能会期望他们总是以相同的顺序排在第二个队列中,而且更多的时候是这样。但偶尔他们不会


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

你预计会发生什么?结果与您的期望有什么不同?这两个代码的结果看起来都是完全可以接受的。多线程的魔力。你为什么会认为不会是这样?对不起,我还是个初学者,正在尝试理解线程的概念。每个线程都有自己的变量副本,所以它们根本没有相互作用,也没有必要同步访问任何资源,因为它们没有共享资源。是的,只需删除第二行之后的所有内容。(编辑)就像刚才那样:|