我有这个计时器功能,它给我以下异常.
收集被修改; 从哈希表中删除对象后,枚举操作可能无法执行.
什么是实现类似功能的解决方案
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)