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)