我在更改代码块时遇到了这个问题。
List<Entity> entities = new List<Entity>();
//Some values added to the list ....
foreach(var entity in entities)
{
Thread th = new Thread(new ThreadStart(SomeMethod));
th.Start(entity);
}
SomeMethod正在接受实体并对其进行更改。像
这样的东西private void SomeMethod(Entity entity)
{
//Some operation on entity
}
这是一个.NET 2.0代码,在将其更改为4.0时,我做了一些小改动,即
foreach(var entity in entities)
{
Thread th = new ThreadStart(() => SomeMethod(entity));
th.Start();
}
这不起作用,从错误看起来实体变量在线程之间变化并导致一些空引用异常。我已经改变了其他任何东西,只要代码恢复到以前的方式,就可以了。谁能解释一下呢?
答案 0 :(得分:0)
请尝试以这种方式使用新的局部变量:
foreach(var entity in entities)
{
var copy = entity;
Thread th = new ThreadStart(() => SomeMethod(copy));
th.Start();
}
如果以这种方式引入变量,使用新变量的方法将无效
Thread th = new ThreadStart(() => {var copy = entity; SomeMethod(copy)) };
因为该代码仍将捕获在循环的每次迭代中更改的循环变量。
另请注意如果实体集合包含两次相同的元素,您可以获得您描述的错误(这是对同一个Entity
的两次引用宾语)。请确保情况并非如此。