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)
| 归档时间: |
|
| 查看次数: |
20726 次 |
| 最近记录: |