基本多线程代码没有按预期工作
本文关键字:工作 本多 多线程 代码 | 更新日期: 2023-09-27 18:07:45
我是新的多线程,我有一个非常简单的代码意想不到的结果:
public void Run()
{
for (int i = 0; i < 10; i++)
{
Thread t = new Thread(() => myFun((i + 1)));
t.Start();
}
}
private void myFun(int threadNo)
{
Console.WriteLine("Thread #" + threadNo.ToString());
}
有人能解释一下为什么上面的代码打印这个到控制台窗口吗?
线程# 3 线程# 3 线程# 3 线程# 6 线程# 6 线程# 8 线程# 9 线程# 10 线程# 11 线程# 11这是因为你使用了一个lambda来关闭循环变量。
重构你的代码:
public void Run()
{
for (int i = 0; i < 10; i++)
{
int j = i;
Thread t = new Thread(() => myFun((j + 1)));
t.Start();
}
}
private void myFun(int threadNo)
{
Console.WriteLine("Thread #" + threadNo.ToString());
}
并享受变化
您可以像Jesse建议的那样在循环中使用"局部"变量,或者您可以使用参数化的start (ParameterizedThreadStart):
public void Run()
{
for (int i = 0; i < 10; i++)
{
Thread t = new Thread(myFun);
t.Start(i + 1);
}
}
private void myFun(object threadNo)
{
Console.WriteLine("Thread #" + threadNo.ToString());
}