2014-09-10 68 views
0

你好人我有问题在线程中使用参数。问题是我把一个对象List<object>作为线程数组的一个参数,迭代到列表列表(List<List<Object>>)的foreach循环中,并且有时它会复制参数(我已经检查过在我放置它之前是否有重复的对象在一个线程中)。我的代码是这样的。有谁知道什么是错的?在此先感谢线程C中的重复参数#

foreach (List<object> list2 in list1) 
{ 

    threads[i] = new Thread(() =>DoWork(list2, nRetorno)); 
    threads[i].Name = "thread " + i; 
    threads[i].Start(); 
    Thread.Sleep(5); 
    i++; 
} 
+0

这一个涵盖完全相同的问题,因为你几乎相同的示例代码 - http://stackoverflow.com/questions/8898925/is-there-a-reason-for- cs-reuse-the-the-variable-in-a-foreach/8899347#8899347。它涵盖了一些关于'foreach'和关闭的细节(与重复相同)。 – 2014-09-10 22:00:25

+0

感谢您的回答..我以为我是与线程错误..但这显然是主要问题..与更多的罪恶后果 – hexehell00 2014-09-10 22:43:11

回答

0

在C#中还有用foreach工作的一些奇怪的行为,请尝试使用引用变量,而不是在foreach一个样:

foreach (List<object> list2 in list1) 
      { 
       var list = list2; 

       threads[i] = new Thread(() =>DoWork(list, nRetorno)); 
       threads[i].Name = "thread " + i; 
       threads[i].Start(); 
       Thread.Sleep(5); 
       i++; 
      } 
+0

感谢您的回答 – hexehell00 2014-09-10 22:42:04

0

你拉姆达捕捉list2变量而不是价值。它复制到本地第一:

  foreach (List<object> list2 in list1) 
      { 
       List<object> list3 = list2; 
       threads[i] = new Thread(() =>DoWork(list3, nRetorno)); 
       threads[i].Name = "thread " + i; 
       threads[i].Start(); 
       Thread.Sleep(5); 
       i++; 
      } 
+0

感谢您的答案 – hexehell00 2014-09-10 22:42:21