У меня есть синхронизированная хеш-таблица, из которой я регулярно удаляю некоторые записи.Несколько потоков запускают этот код.Поэтому я блокирую весь foreach, но иногда получаю InvalidOperationException: Collection был изменен ... в Hashtable.HashtableEnumerator.MoveNext () - т.е. в цикле foreach.Что я делаю неправильно?Не достаточно ли блокировки?
<code>private static readonly Hashtable sessionsTimeoutData = Hashtable.Synchronized(new Hashtable(5000));</p>
<p>private static void ClearTimedoutSessions()
{
List keysToRemove = new List();
long now = DateTime.Now.Ticks;
lock (sessionsTimeoutData)
{
TimeoutData timeoutData;
foreach (DictionaryEntry entry in sessionsTimeoutData)
{
timeoutData = (TimeoutData)entry.Value;
if (now - timeoutData.LastAccessTime > timeoutData.UserTimeoutTicks)
keysToRemove.Add((ulong)entry.Key);
}
}
foreach (ulong key in keysToRemove)
sessionsTimeoutData.Remove(key);
}