我有一个简单的应用程序与以下代码:
FileInfo[] files = (new DirectoryInfo(initialDirectory)).GetFiles(); Listthreads = new List (files.Length); foreach (FileInfo f in files) { Thread t = new Thread(delegate() { Console.WriteLine(f.FullName); }); threads.Add(t); } foreach (Thread t in threads) t.Start();
让我们说在'I = initialDirectory'目录中我有3个文件.然后,该应用程序应创建3个线程,每个线程打印一个文件名; 但是,每个线程将打印出'files'数组中最后一个文件的名称.
为什么是这样?为什么当前文件'f'变量无法正确设置匿名方法?
匿名方法保持对封闭块中变量的引用 - 而不是变量的实际值.
当实际执行方法(当你启动线程时)f
被指定为指向集合中的最后一个值时,所有3个线程都打印最后一个值.
这里有一些关于C#中匿名方法的好文章以及将由编译器生成的代码:
http://blogs.msdn.com/oldnewthing/archive/2006/08/02/686456.aspx
http://blogs.msdn.com/oldnewthing/archive/2006/08/03/687529.aspx
http:// blogs.msdn.com/oldnewthing/archive/2006/08/04/688527.aspx
我想如果你这样做了:
foreach (FileInfo f in files) { FileInfo f2 = f; //variable declared inside the loop Thread t = new Thread(delegate() { Console.WriteLine(f2.FullName); }); threads.Add(t); }
它会以你想要的方式工作.