线程数组c#

aha*_*ron 10 c# multithreading

我有这个代码:

    Thread[] threadsArray = new Thread[4];
        for (int i = 0; i < 4; i++)
        {
            threadsArray[i] = new Thread(() => c1.k(i));
        }
        for (int i = 0; i < 4; i++)
        {
            threadsArray[i].Start();
        }
        for (int i = 0; i < 4; i++)
        {
            threadsArray[i].Join();
        }
Run Code Online (Sandbox Code Playgroud)

函数k是这样的:

void k(int i)
{
    while(true)
      Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)

由于某种原因,最后一个线程正在运行并打印4444444 ....为什么不是所有线程都在运行?

SLa*_*aks 25

所有线程都打印相同的变量.

lambda表达式(() => c1.k(i))i通过引用捕获变量.
因此,当lambda表达式运行之后i++,它会获取新的值i.

要解决这个问题,你需要在循环中声明一个单独的变量,以便每个lambda获得自己的变量,如下所示:

    for (int i = 0; i < 4; i++)
    {
        int localNum = i;
        threadsArray[i] = new Thread(() => c1.k(localNum));
    }
Run Code Online (Sandbox Code Playgroud)

  • 这个答案+1.它与Winston的基本相同,但解释更为详细. (3认同)