C#线程似乎启动了多次

标签 c# multithreading

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

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

似乎在一个循环迭代中启动了多个线程!?

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

有人遇到过类似的问题吗?

谢谢

最佳答案

您正在经历“访问修改后的闭包”错误的痛苦。这是 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();                
    }

也就是说,这段代码不是好代码;不要创建那么多线程。线程是重量级的。像对待雇用新员工一样对待创建话题;您不会雇用员工重命名文件然后解雇他们;太贵。您需要雇用一名员工来重命名所有文件。

关于C#线程似乎启动了多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14782784/

相关文章:

c# - 单声道 GTK# : Trying to remove text in ComboBox and then prepend new text to the ComboBox but some of the old text remains

android - 使用线程等待来自服务的消息

c# - CollectionBase 与泛型

c# - 如何在 C# 中确定系统是否支持触摸

c++ - 我可以将 QObject 数组的单个元素移动到另一个 QThread

multithreading - 在 amd64 上拆分堆栈是不必要的

c++ - 共享指针的双重检查锁定

java - 在主 ui 线程上处理来自其他线程的过多动画请求 - android

c# - 如何在 C# 中声明具有特殊字符的字符串常量

c# - 将对象转换为派生类的对象