收集被修改; 枚举操作可能不会为哈希表执行

Kaz*_*oom 4 c# enumeration

我有这个计时器功能,它给我以下异常.
收集被修改; 从哈希表中删除对象后,枚举操作可能无法执行.

什么是实现类似功能的解决方案

void timerFunction(object data)
    {
    lock (tMap.SyncRoot)
    {
      foreach (UInt32 id in tMap.Keys)
      {
         MyObj obj=(MyObj) runScriptMap[id];
         obj.time = obj.time -1;
         if (obj.time <= 0)
         {                      
            tMap.Remove(id);
         }
       }
    }
Run Code Online (Sandbox Code Playgroud)

ito*_*son 10

传统的方法是,在foreach循环中,将要删除的项目收集到List中.然后一旦foreach循环完成,再对该List执行另一个foreach(这次没有超过tMap),调用tMap.Remove:

void timerFunction(object data)
{
  lock (tMap.SyncRoot)
  {
    List<UInt32> toRemove = new List<UInt32>();

    foreach (UInt32 id in tMap.Keys)
    {
      MyObj obj=(MyObj) runScriptMap[id];
      obj.time = obj.time -1;
      if (obj.time <= 0)
      {                      
        toRemove.Add(id);
      }
    }

    foreach (UInt32 id in toRemove)
    {
      tMap.Remove(id);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)