Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基本多线程代码未按预期工作_C#_Multithreading - Fatal编程技术网

C# 基本多线程代码未按预期工作

C# 基本多线程代码未按预期工作,c#,multithreading,C#,Multithreading,我是多线程新手,我用一个非常简单的代码得到了意想不到的结果: public void Run() { for (int i = 0; i < 10; i++) { Thread t = new Thread(() => myFun((i + 1))); t.Start(); } } private void myFun(int threadNo)

我是多线程新手,我用一个非常简单的代码得到了意想不到的结果:

    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());
}

享受变化。

这是因为您使用的是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建议的那样在循环中使用局部变量,也可以使用参数化的开始:


您可以像Jesse建议的那样在循环中使用局部变量,也可以使用参数化的开始:


显然,我希望线程1线程2。。。3…4…5…6…7…8…9…10显然我希望线程1线程2。。。3...4...5...6...7...8...9...10