Thread.Start与ThreadStart中的Action相关

时间:2013-12-04 04:14:43

标签: multithreading c#-4.0 delegates

我在更改代码块时遇到了这个问题。

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();
}

这不起作用,从错误看起来实体变量在线程之间变化并导致一些空引用异常。我已经改变了其他任何东西,只要代码恢复到以前的方式,就可以了。谁能解释一下呢?

1 个答案:

答案 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的两次引用宾语)。请确保情况并非如此。