Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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#多线程中的变量值不一致_C#_Multithreading - Fatal编程技术网

C#多线程中的变量值不一致

C#多线程中的变量值不一致,c#,multithreading,C#,Multithreading,我正在尝试学习如何在C#中使用多线程。我从开始工作,这解释了如何使用lambda表达式传递参数。我建立了一个玩具程序来测试这一点,但我对输出感到困惑 这是我的密码: using System; using System.Threading; namespace MultithreadingApplication { class ThreadCreationProgram { public static void CallToChildThread(int id)

我正在尝试学习如何在C#中使用多线程。我从开始工作,这解释了如何使用lambda表达式传递参数。我建立了一个玩具程序来测试这一点,但我对输出感到困惑

这是我的密码:

using System;
using System.Threading;

namespace MultithreadingApplication
{
   class ThreadCreationProgram
   {
      public static void CallToChildThread(int id)
      {
         Console.WriteLine(string.Format("Child thread {0} starts", id));
      }

      static void Main(string[] args)
      {
        for (int i=0; i<10; i++)
        {
            Console.WriteLine(string.Format("i: {0}", i));
            Thread childThread = new Thread( () => CallToChildThread (i) );
             childThread.Start();
        }
      }
   }
}

子函数只打印它所传递的id的值。我希望这些值的范围是0到9,但是
CallToChildThread
显示的是1到10。有人能解释一下原因吗?

我刚刚运行了这个程序,结果如下:

i: 0
i: 1
i: 2
Child thread 2 starts
i: 3
Child thread 2 starts
Child thread 3 starts
i: 4
Child thread 4 starts
Child thread 4 starts
i: 5
i: 6
i: 7
Child thread 7 starts
Child thread 7 starts
i: 8
i: 9
Child thread 9 starts
Child thread 9 starts
Child thread 10 starts
这很好地说明了多线程的一个问题:共享变量。在这方面:

Thread childThread = new Thread( () => CallToChildThread (i) );
假设您创建了一个当前值为
i
的lambda。你没有。创建一个lambda,引用循环变量
i
。只有当您的子线程到达
CallToChildThread
的开头时(可能在稍后的某个时间发生),才会计算
i
的值并将其复制到局部变量
id

解决方法很简单:

int _i = i;
Thread childThread = new Thread(() => CallToChildThread(_i));

这将产生子线程0到9。

这已被多次询问。我已将你的问题标记为重复问题。使用术语“关闭循环变量”@SriramSakthivel进行搜索-感谢您提供的信息。主要问题是知道要搜索什么。即使你提到了正确的术语,“结束循环变量”对我来说也不明显。不用担心。发生了:)
int _i = i;
Thread childThread = new Thread(() => CallToChildThread(_i));