c# - 对静态集合的线程安全访问

标签 c# collections thread-safety

我正在创建一个具有某种键值对的类。目前,我有类似以下内容:

private static Dictionary<Type, List<PropertyInfo>> PropertyCache { get; set; }

这是线程安全方法的正确实现方法吗?由于某种原因,在这种情况下,staticDictionary 的影响一直困扰着我。如果这是正确的,是否有可以演示的错误方法,以便我可以在代码的其余部分中避免它。

此外,它应该是只读的(我只会从集合中添加或删除内容)吗?

如果有区别,该属性将始终被声明为私有(private)

提前致谢

虽然标记为 C#,但 VB 中的答案还可以,可以说我是“双语”

编辑:

在 Jon Skeet 在他的答案的评论中进行讨论后,用法将是:

// I will do this
PropertyCache.Add(typeof(string), new List<PropertyInfo>());
PropertyCache.Remove(typeof(string));

// I will never do this 
PropertyCache = new Dictionary<Type, List<PropertyInfo>>();

我也永远不会迭代该集合,只会通过键访问。

最佳答案

您可能应该将其设置为只读,除非您需要更改变量的值,是的。

如果您使用 .NET 4,则应考虑使用 ConcurrentDictionary - 否则,我可能会编写只为每次访问获取一个锁的访问器。虽然您可以使用ReaderWriterLockSlim等,但我个人会选择最简单的安全方法来开始。

请注意,以线程安全的方式迭代字典的内容会很棘手 - 但希望您不需要这样做。

关于c# - 对静态集合的线程安全访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8086449/

相关文章:

c# - asp.net 成员(member)资料更新

java - 使用流通过自定义比较器收集到 TreeSet

arrays - 快速数组/集合中特定实例的索引

c#集合类型,保持索引顺序

c++ - 锁定 vs (try_lock, sleep, repeat) 性能

java - 映射为 ConcurrentHashMap 中的值

c++ - 完全线程安全的 shared_ptr 实现

c# - '在使用 C# ASP.NET 时 WebClient 请求期间发生异常

c# - 为什么我的 C# DLL 中的方法丢失了?

c# - 将文件上传到 FTPS 服务器