基本多线程代码没有按预期工作

本文关键字:工作 本多 多线程 代码 | 更新日期: 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());
}