110,545
社区成员
发帖
与我相关
我的任务
分享
Task[] task = new Task[count];
for (int i = 0; i < count; i++)
{
myModel my = new myModel();
my.id = "ID:" + i.ToString();
my.name = "姓名:" + i.ToString();
my.age = "性别:" + i.ToString();
int a = i;
task[i] = new Task(()=> {
list1.Add(i.ToString()); // 为什么这个I都是一样的
list1.Add(a.ToString()); // 这个就是正常的循环值
list_model.Add(my);
});
task[i].Start();
}
[quote=引用 14 楼 zhuo_wp 的回复:] 这个跟.net的版本有关
这个跟.net的版本有关
lambdal表达式不就是委托嘛。
Task[] task = new Task[count]; for (int i = 0; i < count; i++) { myModel my = new myModel(); my.id = "ID:" + i.ToString(); my.name = "姓名:" + i.ToString(); my.age = "性别:" + i.ToString(); int a = i; task[i] = new Task(()=> { list1.Add(i.ToString()); // 为什么这个I都是一样的 list1.Add(a.ToString()); // 这个就是正常的循环值 list_model.Add(my); }); task[i].Start(); }
task[i].Start(); task[i].Wait();
变量通过闭包传到另外的线程,情况会比较复杂,容易出现你这种与预期不符的情况。 最好是不用闭包传值,将变量显式传递到新的线程中。 Task 类型我没有使用过,不过我使用的线程启动方法,都会有一个带参数的重载的。
这是framework 4.0里面闭包的一个bug(也可以说是设计如此)。 楼主再测一下framework 4.5之后的版本,应该结果是不一样的。
[quote=引用 4 楼 u010941149 的回复:] 你用的是委托,你懂委托的原理吗? 你用的是vs2010?
你用的是委托,你懂委托的原理吗? 你用的是vs2010?