C# 线程C中的重复参数#

C# 线程C中的重复参数#,c#,multithreading,C#,Multithreading,大家好,我在线程中使用参数时遇到问题。问题在于,我将对象列表作为迭代列表(列表)的foreach循环中的线程数组的参数,有时它会复制参数(在将其放入线程之前,我已经检查了没有重复的对象)。我的代码是这样的。有人知道怎么回事吗?。提前谢谢 foreach (List<object> list2 in list1) { threads[i] = new Thread(() =>DoWork(list2, nRetorno)); threads[i].Name =

大家好,我在线程中使用参数时遇到问题。问题在于,我将对象
列表
作为迭代列表(
列表
)的foreach循环中的线程数组的参数,有时它会复制参数(在将其放入线程之前,我已经检查了没有重复的对象)。我的代码是这样的。有人知道怎么回事吗?。提前谢谢

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++;
}
foreach(列表1中的列表2)
{
线程[i]=新线程(()=>DoWork(列表2,nRetorno));
线程[i].Name=“thread”+i;
线程[i].Start();
睡眠(5);
i++;
}
在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++;
            }
foreach(列表1中的列表2)
{
var list=list2;
线程[i]=新线程(()=>DoWork(列表,nRetorno));
线程[i].Name=“thread”+i;
线程[i].Start();
睡眠(5);
i++;
}

您的lambda正在捕获
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++;
            }
foreach(列表1中的列表2)
{
列表3=列表2;
线程[i]=新线程(()=>DoWork(列表3,nRetorno));
线程[i].Name=“thread”+i;
线程[i].Start();
睡眠(5);
i++;
}

这篇文章与您的文章完全相同,示例代码几乎相同-。它涵盖了有关
foreach
和闭包(与duplicate相同)的更多详细信息。感谢您的回答。。我以为我在线程方面犯了错误。。但这显然是主要问题。。谢谢你的回答谢谢你的回答