【发布时间】:2017-12-28 06:12:34
【问题描述】:
我必须通过某些键从 ConcurrentDictionary 中删除项目。像这样:
ConcurrentDictionary<SomeClass, string> dict = new ConcurrentDictionary<SomeClass, string>();
//adding some values
var keys = dict.Keys.Where(k => k.Name == "Example");
foreach (var key in keys)
dict.TryRemove(key, out _);
问题是:我在开始循环时枚举键集合。如果有人同时更改字典怎么办? dict.Keys 是否返回快照?
【问题讨论】:
-
它返回一个副本。见here。
-
它返回一个
snapshot(所以是的,它会正常工作)。我建议使用var keys = dict.Select(z => z.Key).Where(k => k.Name == "Example");来减少对快照的需求(即锁定)——即它通常会更快。或者只是在字典上foreach,就像在副本中一样。
标签: c# concurrency