【发布时间】:2011-08-11 08:58:47
【问题描述】:
我有一个同步的哈希表,我会定期从中删除一些条目。多个线程运行此代码。所以我锁定了整个 foreach,但有时我仍然会得到 InvalidOperationException: Collection was modified ... at Hashtable.HashtableEnumerator.MoveNext() - 即在 foreach 循环中。 我究竟做错了什么?锁定还不够吗?
private static readonly Hashtable sessionsTimeoutData = Hashtable.Synchronized(new Hashtable(5000));
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);
}
【问题讨论】:
-
专业提示:除非您被困在 .NET 1.1 中,否则请使用通用版本。它们更快、更安全、更好。
标签: c# multithreading collections