枚举时修改了集合

时间:2012-04-19 11:28:31

标签: c# list thread-safety action

  

可能重复:
  Collection was modified; enumeration operation may not execute

我有一个通用列表,我在枚举时执行一些操作。

foreach(Action<string> action in actionList) 
{
    if(action != null) {
        action(mystring);
    }
}

现在我得到了这个例外:

InvalidOperationException:
Collection was modified; enumeration operation may not execute

如何解决这个问题,我紧紧抓住.NET 3.5:/

2 个答案:

答案 0 :(得分:6)

很可能其中一个操作会修改actionList,使迭代器无效。避免错误的最简单方法是首先获取列表的副本,例如

foreach(Action<string> action in actionList.ToList()) 
{
    if(action != null) {
        action(mystring);                               
    }
}

甚至:

foreach (var action in actionList.Where(action => action != null).ToList())
{
    action(mystring);
}

答案 1 :(得分:0)

您在迭代期间修改了actionList。它可以是第二个线程,它与当前循环或进行修改或另一次迭代的动作方法不同步。所以解决方案可能是:

var tmp = new List<Action<string> >(actionList);
foreach(Action<string> action in tmp) 
{
    if(action != null) {
      action(mystring);                               
    }
}

但是只有在并行线程的情况下修改动作的情况下才会有效,你应该同步列表。