Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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

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,我试图理解为什么这个代码不起作用 private static object _lock; public static void Main (string[] args) { Thread thread; _lock = new object(); foreach (int num in Enumerable.Range(0,5)) { thread = new Thread (() =>

我试图理解为什么这个代码不起作用

    private static object _lock;

    public static void Main (string[] args)
    {
        Thread thread;
        _lock = new object();

        foreach (int num in Enumerable.Range(0,5)) {
            thread  = new Thread (() => print(num.ToString()));
            thread.Start(); 
        }
    }

    public static void print(string text)
    {
        lock(_lock)
        {
            Console.WriteLine(text);
        }
    }
我得到的结果是

四, 1. 4. 4. 三,


或任何其他随机数字。为什么它会重复数字?

因为每个线程都引用循环变量,并且在创建线程时不会获得自己的副本

请注意,编译器警告您:“访问修改的闭包”


你的锁根本不起任何作用;只有一个线程锁定在该对象上,即启动其他线程的线程。其他线程根本就不会争夺锁。

哦,我的天啊,当然。非常感谢你。我不敢相信我没有意识到这一点。海报说明:C#中的for-each和闭包有点“抓到”(for-each中引入的变量是每个循环中相同的变量):这将“修复它”:
foreach(int-num-in…{int-num=\u-num;/*相同的*/}
是的,但原因是什么?;-)
    foreach (int num in Enumerable.Range(0,5))
    {
        int loopnum = num;

        thread = new Thread(() => print(loopnum.ToString())); 
        thread.Start();  
    }