当前位置:  开发笔记 > 编程语言 > 正文

C#2.0线程问题(匿名方法)

如何解决《C#2.0线程问题(匿名方法)》经验,为你挑选了2个好方法。

我有一个简单的应用程序与以下代码:

   FileInfo[] files = (new DirectoryInfo(initialDirectory)).GetFiles();
   List threads = 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'变量无法正确设置匿名方法?



1> Stewart John..:

匿名方法保持对封闭块中变量的引用 - 而不是变量的实际值.

当实际执行方法(当你启动线程时)f被指定为指向集合中的最后一个值时,所有3个线程都打印最后一个值.



2> Michał Piask..:

这里有一些关于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);
   }

它会以你想要的方式工作.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有