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);
}
}
}
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:
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);
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With