我必须通过某些键从ConcurrentDictionary中删除项目。像这样:
FusedLocationProviderApi
问题是:我在开始循环时枚举密钥集合。如果有人会在同一时间更改字典怎么办? dict.Keys会返回快照吗?
答案 0 :(得分:4)
ConcurrentDictionary的所有公共成员和受保护成员 是线程安全的,可以从多个线程同时使用。 但是,成员通过其中一个接口访问了 ConcurrentDictionary实现,包括扩展 方法,不保证是线程安全的,可能需要 由来电者同步。
来自https://msdn.microsoft.com/en-us/library/dd287191(v=vs.110).aspx#Anchor_10
答案 1 :(得分:3)
查看source code:
public ICollection<TKey> Keys
{
get { return GetKeys(); }
}
private ReadOnlyCollection<TKey> GetKeys()
{
int locksAcquired = 0;
try
{
AcquireAllLocks(ref locksAcquired);
int count = GetCountInternal();
if (count < 0) throw new OutOfMemoryException();
List<TKey> keys = new List<TKey>(count);
for (int i = 0; i < _tables._buckets.Length; i++)
{
Node current = _tables._buckets[i];
while (current != null)
{
keys.Add(current._key);
current = current._next;
}
}
return new ReadOnlyCollection<TKey>(keys);
}
finally
{
ReleaseLocks(0, locksAcquired);
}
}
它锁定集合并返回键的副本