集合已修改;哈希表可能无法执行枚举操作
我有这个计时器功能,它给了我以下异常。
集合已修改;枚举操作可能无法执行 一旦我从哈希表中删除对象。
实现类似功能的解决方案是什么
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);
}
}
}
I have this timer function, it gives me following exception.
Collection was modified; enumeration operation may not execute
once i remove the object from hashtable.
what is the solution to implement similar functionality
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);
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
传统的方法是,在 foreach 循环中,将要删除的项目收集到列表中。然后,一旦 foreach 循环完成,就对该 List 执行另一个 foreach(这次不是在 tMap 上),调用 tMap.Remove:
The traditional way is, in your foreach loop, to collect the items to be deleted into, say, a List. Then once the foreach loop has finished, do another foreach over that List (not over tMap this time), calling tMap.Remove:
http://social. msdn.microsoft.com/Forums/en-IE/csharplanguage/thread/519c6abc-5b5b-457a-adfb-251ee013d123
http://social.msdn.microsoft.com/Forums/en-IE/csharplanguage/thread/519c6abc-5b5b-457a-adfb-251ee013d123
您可以创建一个临时列表,并将要删除的 ID 添加到该列表中。然后在循环完成后,删除该列表中的所有项目:
You could make a temporary list, and add the Ids to remove to that list. Then after your loop finishes, remove all items in that list: