此程序应将 .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/