C#Thread似乎多次启动

fr_*_*0_g 1 c# multithreading

本程序应将.txt文件重命名为.txtok.在我的测试目录中,我创建了~10个文本文件.

在运行时,抛出了FileNotFoundException.丢失的文件是一个已经在之前的线程中重命名的文件.

似乎多个线程已经在一个Loop-Iteration中启动了!?

static void Main(string[] args)
    {
        foreach (String s in Directory.EnumerateFiles(@"C:\Test", "*.txt", SearchOption.TopDirectoryOnly))
        {
            new Thread(() =>
            {
                File.Move(s, s + "ok");
            }).Start();                
        }
        Console.ReadKey();
    }
Run Code Online (Sandbox Code Playgroud)

有人有问题吗?

谢谢

Eri*_*ert 12

您正在经历"访问修改后的闭包"错误的痛苦.这是StackOverflow上报告的最常见问题之一.搜索"访问修改后的闭包"了解更多详情,或阅读我关于该主题的文章:

http://ericlippert.com/2009/11/12/closing-over-the-loop-variable-considered-harmful-part-one/

您可以通过升级到C#5或通过执行以下操作来修复它:

    foreach (String s in Directory.EnumerateFiles(@"C:\Test", "*.txt", SearchOption.TopDirectoryOnly))
    {
        string s1 = s;
        new Thread(() =>
        {
            File.Move(s1, s1 + "ok");
        }).Start();                
    }
Run Code Online (Sandbox Code Playgroud)

也就是说,这段代码不是很好的代码; 不要创建这么多的线程.线程是重量级的.善待创建一个像招聘新员工一样的线程; 你不会雇用员工来重命名文件然后解雇他们; 太贵.您雇用一名员工重命名所有文件.